[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-20 至 2010-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 行受影响)*/
- [sql server] 根据周期得到时间范围
- Sql Server中时间范围
- sql server时间范围查询语句
- Mysql根据时间范围查询
- SQL Server 和 .net 对时间的大小范围定义
- JavaScript 得到上周时间范围,本月时间范围
- sql判断时间范围
- 根据时间日期 得到星期时间
- php 得到某月的时间戳范围
- C#根据当前时间确定日期范围
- 根据数据范围估算时间复杂度
- mongodb中根据时间范围进行查询
- Oracle中根据时间范围查询数据
- mysql 根据日期得到时间戳
- mysql 根据时间戳得到日期
- android 根据时间得到年龄,星座
- sql 时间范围查询条件
- SQL Server-数据类型-数值范围
- ASP.NET程序中常用的三十三种代码
- C#泛型
- 数据库中乐观锁与悲观锁的概念
- PHP的垃圾收集机制
- 编程之美笔记——光影切割问题
- [sql server] 根据周期得到时间范围
- 通用系统在中国死路一条
- 如何判断Ext.window已经显示
- PHP对MYSQL数据库进行事务处理及表锁定
- 详解C#中访问私有成员
- Revit二次开发从入门到精通学习之路
- Debian lenny下json-c安装
- FileUploadProgress 配置用法
- Compass使用