[sql server] 根据周期得到时间范围

来源:互联网 发布:淘宝学历证书 编辑:程序博客网 时间:2024/06/06 04:03

http://topic.csdn.net/u/20100724/01/78d034a5-9374-409f-8643-39f994856f5b.html

 

----问题描述

 

数据库是 SQL SERVER 2000

想写一个函数或一个存储过程

假设时间段为:
2010-01-202010-10-19

参数为1(即一个月)

生成数据:

检查项目    周期序号    开始        结束
'A1'        1        2010-01-20    2010-02-19
'A1'        2        2010-02-20    2010-03-19
'A1'        3        2010-03-20    2010-04-19
'A1'        4        2010-04-20    2010-05-19
'A1'        5        2010-05-20    2010-06-19
'A1'        6        2010-06-20    2010-07-19
'A1'        7        2010-07-20    2010-08-19
'A1'        8        2010-08-20    2010-09-19
'A1'        9        2010-09-20    2010-10-19

参数为2(即两个月)

检查项目    周期序号    开始        结束
'A1'        1        2010-01-20    2010-03-19
'A1'        2        2010-03-20    2010-05-19
'A1'        3        2010-05-20    2010-07-19
'A1'        4        2010-07-20    2010-09-19
'A1'        5        2010-09-20    2010-10-19    --不够两个月

参数为3(即三个月)

检查项目    周期序号    开始        结束
'A1'        1        2010-01-20    2010-04-19
'A1'        2        2010-04-20    2010-07-19
'A1'        3        2010-07-20    2010-10-19

当然参数也可能为其它整数

 

 

----解决方法

 

if object_id('f_test')is not null drop function f_test
go
create function f_test(@s datetime,@e datetime,@c int)
returns @t table(检查项目 varchar(10),周期序号 int identity,开始 datetime,结束 datetime)
as
begin
   
declare @d datetime,@i int
   
set @i=1
   
while dateadd(month,@i*@c,@s)-1<=@e
   
begin
       
insert @t select 'A1',dateadd(month,(@i-1)*@c,@s),dateadd(month,@i*@c,@s)-1
       
set @i=@i+1       
   
end
   
if dateadd(month,(@i-1)*@c,@s)<@e
       
insert @t select 'A1',dateadd(month,(@i-1)*@c,@s),@e
   
return
end
go

--
declare @s datetime,@e datetime,@i int
set @s='2010-01-20'
set @e='2010-10-19'
set @i=1
select 检查项目,周期序号,convert(varchar(10),开始,120) 开始,        convert(varchar(10),结束,120)结束  from f_test(@s,@e,@i)
/*
检查项目       周期序号        开始         结束
---------- ----------- ---------- ----------
A1         1           2010-01-20 2010-02-19
A1         2           2010-02-20 2010-03-19
A1         3           2010-03-20 2010-04-19
A1         4           2010-04-20 2010-05-19
A1         5           2010-05-20 2010-06-19
A1         6           2010-06-20 2010-07-19
A1         7           2010-07-20 2010-08-19
A1         8           2010-08-20 2010-09-19
A1         9           2010-09-20 2010-10-19

(9 行受影响)
*/

set @i=2
select * from f_test(@s,@e,@i)
/*
检查项目       周期序号        开始                      结束
---------- ----------- ----------------------- -----------------------
A1         1           2010-01-20 00:00:00.000 2010-03-19 00:00:00.000
A1         2           2010-03-20 00:00:00.000 2010-05-19 00:00:00.000
A1         3           2010-05-20 00:00:00.000 2010-07-19 00:00:00.000
A1         4           2010-07-20 00:00:00.000 2010-09-19 00:00:00.000
A1         5           2010-09-20 00:00:00.000 2010-10-19 00:00:00.000

(5 行受影响)
*/
set @i=3
select * from f_test(@s,@e,@i)
/*
检查项目       周期序号        开始                      结束
---------- ----------- ----------------------- -----------------------
A1         1           2010-01-20 00:00:00.000 2010-04-19 00:00:00.000
A1         2           2010-04-20 00:00:00.000 2010-07-19 00:00:00.000
A1         3           2010-07-20 00:00:00.000 2010-10-19 00:00:00.000

(3 行受影响)
*/

 

原创粉丝点击