SqlServer查询固定开始和结束时间段内所有日期

2020-08-10 14:58:17数据库技术围观数:5590 点赞数:553

需求如下:给出2个固定时间,求此时间段内每日的业务数量,但是业务表中存储的日期是不全的, 某一天如果没有业务,就没有那天的数据,比如这样:8月1号 10个,8月3号 30个,8月5号 50个。
想法如下:先查询出此时间内所有按天日期数据,然后关联业务表查询出业务数据,没有的0代替。
利用日期的相加方法dateadd相加连续的数字得到每日日期数据。
如果日期段相差小于2048天,可以利用系统库master中的spt_values表,此表中存储着0到2047的连续数据。如果相差大于2048天就要自己造数据了,先说小于2048的:
declare @date1 DATETIME = '2020-06-01'
declare @date2 DATETIME ='2020-06-10'
select CONVERT(VARCHAR(100),dateadd(day,number,@date1),23) as dt
from master.dbo.spt_values where type ='P'
and number <=DATEDIFF(day, @date1, @date2)

如果可能大于2048天的话,使用临时表造出具体相差间隔天数的连续数据临时使用:
declare @date1 DATETIME = '1988-06-01'
declare @date2 DATETIME ='2020-06-10'
DECLARE @init INT
SET @init=0
DECLARE @allDay INT

CREATE TABLE #N(
ID INT
)
DECLARE cur CURSOR FOR
SELECT DATEDIFF(day, @date1, @date2)
OPEN cur  
FETCH NEXT FROM cur INTO @allDay
WHILE @init<=@allDay
BEGIN
PRINT @init
INSERT INTO #N (ID) VALUES  (  @init         )
SET @init  = @init+1
FETCH NEXT FROM cur INTO @allDay
END
CLOSE cur
DEALLOCATE cur
--SELECT * FROM #N
SELECT CONVERT(VARCHAR(10),DATEADD(DAY,ID,@date1),23) FROM #N WHERE ID<=DATEDIFF(DAY,@date1,@date2)
DROP TABLE #N
使用游标循环间隔数字生成连续数字表。这样无论间隔多少天都ok。

转载请说明出处:博客微站原文链接:

相关阅读:

SqlServer生成0到100的数字的表

sqlserver查询死锁情况语句

推荐一个sqlserver格式化插件 SQLPrompt_7.0.0.40 和使用技巧