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

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 行受影响)
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值