首页 > 解决方案 > 如何每天每小时获取两个日期之间的所有日期?

问题描述

我正在做一些事情,我需要在两个日期之间获取所有日期。下面是我到目前为止尝试过的示例以及我实际需要的示例-:

declare @sTime datetime = '03/03/2019 02:00:00.000'
declare @stopTime datetime = '01/01/3000 02:00:00.000'
declare @interval int = 60
declare @temp_time datetime

declare @tempHourtb ( StartTime datetime not null, StopTime datetime 
not null)

select @temp_time = @sTime
while(datediff(hh, @temp_time, @stopTime) > 0)
begin
   insert into @HourTable
   select @temp_time,dateadd(mi, @interval, @temp_time)
   set @temp_time = dateadd(mi, @interval, @temp_time)
end
select * from @tempHourtb

这给了我以下输出,这是正确的-: 在此处输入图像描述

但是我面临的问题是,当我在开始日期和停止日期之间有很长的差距时,它会花费太多时间。有什么方法可以让我在更短的时间内获得相同的输出?

标签: sql-server

解决方案


这应该会在 3 秒多的时间内生成8,597,809条记录

您可能需要重新考虑 3000 年

Declare @Date1 datetime = '2019-03-03 02:00'
Declare @Date2 datetime = '3000-01-01 02:00'

Select StartTime = D
      ,StopTime  = DateAdd(HOUR,1,D)
 Into  #YourTempTable
 From (
        Select Top (DateDiff(HOUR,@Date1,@Date2)+1) 
               D=DateAdd(HOUR,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2,master..spt_values n3
      ) A

看起来像这样

在此处输入图像描述

编辑 -

添加Into #YourTempTable


推荐阅读