如果我有開始和結束日期,然後是單獨的開始和結束時間,喜歡返回日期範圍內每個日期的時間範圍。將日期範圍和時間範圍組合到一組結果中,該結果包含日期範圍中包含的每一天的時間範圍SQL
這裏有一個小例子: 我有以下變量設置爲以下樣本值:
declare @StartDate date
declare @EndDate date
declare @StartTime time
declare @EndTime time
declare @interval int = 10
set @StartDate = '2017-08-23'
set @EndDate = '2017-08-25'
set @StartTime = '07:00:00'
set @EndTime = '07:30:00'
什麼,我想回如下:
column1
2017-08-23 07:00:00.000
2017-08-23 07:10:00.000
2017-08-23 07:20:00.000
2017-08-23 07:30:00.000
2017-08-24 07:00:00.000
2017-08-24 07:10:00.000
2017-08-24 07:20:00.000
....
等。直到最終的日期時間值。
我想出了一個可行的解決方案(這可能會幫助一些人),但我覺得應該有一個更優雅的方式來實現相同的結果。
這裏是我的解決方案:
;
WITH DateCTE
AS(
Select @StartDate as StartDate
UNION ALL
SELECT DATEADD(DAY,1,StartDate)
FROM DateCTE
WHERE DATEADD(DAY,1,StartDate) <= @EndDate
)
, TimeCTE
AS(
Select @StartTime as StartTime
UNION ALL
SELECT DATEADD(MINUTE,@interval,StartTime)
FROM TimeCTE
WHERE DATEADD(MINUTE,@interval,StartTime) <= @EndTime
)
, DateTimeCTE
as (
select StartDate, StartTime from DateCTE
cross join TimeCTE
)
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), StartDate, 112)
+ ' ' + CONVERT(CHAR(8), StartTime, 108)) as 'datetime'
FROM DateTimeCTE
order by StartDate asc
,StartTime asc
;
我擔心在查詢一切沿着三個熱膨脹係數可能使其體積太大。我是否有權爲此擔憂,還是我只是偏執狂? :)
在任何情況下,如果有人確實知道更清潔的解決方案,我會非常有興趣看到它。
再次感謝!
這是工作代碼,應該發佈在CodeReview上,而不是SO上。 –
標記您正在使用的dbms。該代碼是特定於產品的。 – jarlh
這個問題屬於codereview.stackexchange.com – scsimon