我想构建一个虚拟表,其中包含一年中的每个日期以及一天中的每个小时。我下面的代码创建一个日期表,并分别创建一个小时表。如何更改日期表,以便每个日期最多显示24次才能移至下一个日期,以便可以将两个表连接在一起?
让我知道您是否可以想到一种更有效的方法。
日期表
CREATE TABLE _Dates
(
d DATE,
PRIMARY KEY (d)
)
DECLARE @dIncr DATE = '2018-01-01'
DECLARE @dEnd DATE = '2018-12-31'
WHILE (@dIncr < @dEnd)
BEGIN
INSERT INTO _Dates (d)
VALUES (@dIncr)
SELECT @dIncr = DATEADD(DAY, 1, @dIncr)
END
SELECT * FROM _Dates
DROP TABLE _Dates
小时表
SELECT [Hour] = 0
INTO #hour
CREATE TABLE #hour (h numeric)
INSERT INTO #hour
VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8),
(9), (10), (11), (12), (13), (14), (15), (16),
(17), (18), (19), (20), (21), (22), (23)
答案 0 :(得分:2)
可以通过临时统计表完成
我怀疑性能要好于递归(0.305秒内有8,760行)
示例
Declare @Date1 datetime = '2018-01-01'
Declare @Date2 datetime = '2019-01-01'
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
返回
D
2018-01-01 00:00:00.000
2018-01-01 01:00:00.000
2018-01-01 02:00:00.000
2018-01-01 03:00:00.000
...
2018-12-31 21:00:00.000
2018-12-31 22:00:00.000
2018-12-31 23:00:00.000
2019-01-01 00:00:00.000
答案 1 :(得分:2)
我将插入一个插头,以保持数字表的位置,以进行此类操作。只是一个具有整数序列的表,该字段上有一个主键。
declare @Date1 datetime = '2018-01-01'
Declare @Date2 datetime = '2019-01-01'
select dateadd(hour, n, @Date1)
from Numbers
where n <= DateDiff(HOUR,@Date1,@Date2)