T-SQL中的虚拟日期和小时表

时间:2018-12-06 20:28:19

标签: sql-server tsql

我想构建一个虚拟表,其中包含一年中的每个日期以及一天中的每个小时。我下面的代码创建一个日期表,并分别创建一个小时表。如何更改日期表,以便每个日期最多显示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)

2 个答案:

答案 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)