使用sql查询生成开始到结束日期之间的所有日期

jonboycb 2015-06-12 05:36:53
给定开始日期到结束日期,如2015-05-20 至2015-06-20,请大家帮我想想,能否用sql查询得到如下效果的结果集

...全文
9446 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2017-11-21
  • 打赏
  • 举报
回复
没仔细看, 其实稍改一下就够用了:
DECLARE @beginTime DATETIME,@endTime DATETIME
SET @beginTime='2015-05-20'
SET @endTime='2015-06-20'

/*
 2048 * 2048 = 4194304 天 = 11491.24383561644 年, 足够用了
*/
;WITH t1 AS (
	SELECT sv.number AS n FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P'
)
,t2 AS (
	SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rid  FROM t1 AS a CROSS APPLY t1 AS b
)
SELECT DATEADD(DAY,t2.rid,@beginTime) AS rq 
FROM t2 
WHERE t2.rid BETWEEN 0 AND DATEDIFF(DAY,@beginTime,@endTime)
/*
rq
2015-05-20 00:00:00.000
2015-05-21 00:00:00.000
2015-05-22 00:00:00.000
2015-05-23 00:00:00.000
2015-05-24 00:00:00.000
2015-05-25 00:00:00.000
2015-05-26 00:00:00.000
2015-05-27 00:00:00.000
2015-05-28 00:00:00.000
2015-05-29 00:00:00.000
2015-05-30 00:00:00.000
2015-05-31 00:00:00.000
2015-06-01 00:00:00.000
2015-06-02 00:00:00.000
2015-06-03 00:00:00.000
2015-06-04 00:00:00.000
2015-06-05 00:00:00.000
2015-06-06 00:00:00.000
2015-06-07 00:00:00.000
2015-06-08 00:00:00.000
2015-06-09 00:00:00.000
2015-06-10 00:00:00.000
2015-06-11 00:00:00.000
2015-06-12 00:00:00.000
2015-06-13 00:00:00.000
2015-06-14 00:00:00.000
2015-06-15 00:00:00.000
2015-06-16 00:00:00.000
2015-06-17 00:00:00.000
2015-06-18 00:00:00.000
2015-06-19 00:00:00.000
2015-06-20 00:00:00.000
*/
吉普赛的歌 2017-11-21
  • 打赏
  • 举报
回复
DECLARE @beginTime DATETIME,@endTime DATETIME
SET @beginTime='2015-05-20'
SET @endTime='2015-06-20'

SELECT DATEADD(DAY,sv.number,@beginTime) AS rq 
FROM MASTER.dbo.spt_values AS sv 
WHERE sv.[type]='P' AND sv.number BETWEEN 0 AND DATEDIFF(DAY,@beginTime,@endTime)
/*
rq
2015-05-20 00:00:00.000
2015-05-21 00:00:00.000
2015-05-22 00:00:00.000
2015-05-23 00:00:00.000
2015-05-24 00:00:00.000
2015-05-25 00:00:00.000
2015-05-26 00:00:00.000
2015-05-27 00:00:00.000
2015-05-28 00:00:00.000
2015-05-29 00:00:00.000
2015-05-30 00:00:00.000
2015-05-31 00:00:00.000
2015-06-01 00:00:00.000
2015-06-02 00:00:00.000
2015-06-03 00:00:00.000
2015-06-04 00:00:00.000
2015-06-05 00:00:00.000
2015-06-06 00:00:00.000
2015-06-07 00:00:00.000
2015-06-08 00:00:00.000
2015-06-09 00:00:00.000
2015-06-10 00:00:00.000
2015-06-11 00:00:00.000
2015-06-12 00:00:00.000
2015-06-13 00:00:00.000
2015-06-14 00:00:00.000
2015-06-15 00:00:00.000
2015-06-16 00:00:00.000
2015-06-17 00:00:00.000
2015-06-18 00:00:00.000
2015-06-19 00:00:00.000
2015-06-20 00:00:00.000
*/
超频的时钟 2017-11-21
  • 打赏
  • 举报
回复
可以先按时间列升序获取第一行,再按时间列降序获取第一行,最后得出时间段。
jonboycb 2015-06-15
  • 打赏
  • 举报
回复
引用 6 楼 hery2002 的回复:
你好!我看了你这种方法,spt_values表的number最大是2047,如果两个日期天数相差超过了2047,那么后面的就不会生成了。有没有办法改进; ------ 如果2000行都不够,那么你造这个表的目的? 还不如你自己新建一个日期表,把每天的日期写进去,然后你的程序去关联这个表,用起始日期和结束日期来查询,这样更快,还可以得到索引,统计更新等信息。不建议使用这种临时拼接的方式。
你说得对,那我还是建一个表来关联吧!
hery2002 2015-06-15
  • 打赏
  • 举报
回复
你好!我看了你这种方法,spt_values表的number最大是2047,如果两个日期天数相差超过了2047,那么后面的就不会生成了。有没有办法改进; ------ 如果2000行都不够,那么你造这个表的目的? 还不如你自己新建一个日期表,把每天的日期写进去,然后你的程序去关联这个表,用起始日期和结束日期来查询,这样更快,还可以得到索引,统计更新等信息。不建议使用这种临时拼接的方式。
jonboycb 2015-06-15
  • 打赏
  • 举报
回复
引用 3 楼 hilex_jay 的回复:
declare @StartDate DATETIME = '2015/05/01' declare @EndDate DATETIME ='2015/06/03'; with cte as ( select @StartDate dday union all select dday +1 from cte where dday < @EndDate ) select * from cte
你好!这个方法提示递归只能100次,日期相差超过100就不行了!!
jonboycb 2015-06-15
  • 打赏
  • 举报
回复
引用 2 楼 hery2002 的回复:
利用select * from master.dbo.spt_values

declare @StartDate DATETIME = '2015/05/01'
declare @EndDate DATETIME ='2015/06/03'
select dateadd(day,number,@StartDate) as dt
 from master.dbo.spt_values  where type ='P'
and number <=DATEDIFF(day, @StartDate,   @EndDate)
/*
dt
-----------------------
2015-05-01 00:00:00.000
2015-05-02 00:00:00.000
2015-05-03 00:00:00.000
2015-05-04 00:00:00.000
2015-05-05 00:00:00.000
2015-05-06 00:00:00.000
2015-05-07 00:00:00.000
2015-05-08 00:00:00.000
...
*/
你好!我看了你这种方法,spt_values表的number最大是2047,如果两个日期天数相差超过了2047,那么后面的就不会生成了。有没有办法改进;
hilex_jay 2015-06-15
  • 打赏
  • 举报
回复
option(maxrecursion 0) 错了,不要,号!
hilex_jay 2015-06-15
  • 打赏
  • 举报
回复
declare @StartDate DATETIME = '2015/05/01'
declare @EndDate DATETIME ='2015/06/03';

with cte as
(
  select @StartDate dday
  union all
  select dday +1 from cte 
  where dday < @EndDate
)
select * from cte
option(maxrecursion,0)
hilex_jay 2015-06-13
  • 打赏
  • 举报
回复
declare @StartDate DATETIME = '2015/05/01' declare @EndDate DATETIME ='2015/06/03'; with cte as ( select @StartDate dday union all select dday +1 from cte where dday < @EndDate ) select * from cte
hery2002 2015-06-12
  • 打赏
  • 举报
回复
利用select * from master.dbo.spt_values

declare @StartDate DATETIME = '2015/05/01'
declare @EndDate DATETIME ='2015/06/03'
select dateadd(day,number,@StartDate) as dt
 from master.dbo.spt_values  where type ='P'
and number <=DATEDIFF(day, @StartDate,   @EndDate)
/*
dt
-----------------------
2015-05-01 00:00:00.000
2015-05-02 00:00:00.000
2015-05-03 00:00:00.000
2015-05-04 00:00:00.000
2015-05-05 00:00:00.000
2015-05-06 00:00:00.000
2015-05-07 00:00:00.000
2015-05-08 00:00:00.000
...
*/
还在加载中灬 2015-06-12
  • 打赏
  • 举报
回复
这个需要和数据字辅助表连接才能生成这样的效果,不过建议你给出你的表结构及示例数据,不然就这样说你可能不会明白

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧