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

Sql server T-SQL中日期和小时的虚拟表,sql-server,tsql,Sql Server,Tsql,我想构建一个虚拟表,其中包含一年中的每个日期和一天中的每个小时。下面的代码创建了一个日期表,并分别创建了一个小时表。如何更改日期表,使每个日期在移动到下一个日期之前显示24次,以便将两个表连接在一起 如果你能想出一个更有效的方法,请告诉我 日期表 CREATE TABLE _Dates ( d DATE, PRIMARY KEY (d) ) DECLARE @dIncr DATE = '2018-01-01' DECLARE @dEnd DATE = '2018-12-31'

我想构建一个虚拟表,其中包含一年中的每个日期和一天中的每个小时。下面的代码创建了一个日期表,并分别创建了一个小时表。如何更改日期表,使每个日期在移动到下一个日期之前显示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

可通过临时理货表完成

我怀疑在0.305秒内的性能比递归8760行要好

范例

返回


可通过临时理货表完成

我怀疑在0.305秒内的性能比递归8760行要好

范例

返回


我会插上一个插头,为这样的事情保留一个数字表。只是一个包含整数序列的表,该字段上有一个主键

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)

我会插上一个插头,为这样的事情保留一个数字表。只是一个包含整数序列的表,该字段上有一个主键

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)


您可以交叉连接两个表以获得所需内容:从_dates,hours中选择_dates.d,hour.h;我建议您可以查看此url。根据您的环境,首选DW平面内的esp。您可以交叉连接两个表以获得所需内容:从_dates,hours中选择_dates.d,hour.h;我建议您可以查看此url。根据您的环境,首选DW平面内的esp。真正地旧式连接?@SMor在这种情况下真的很重要吗?如果要使用TOP,您不需要订购吗?在这种情况下,答案是正确的,但不能保证。@EdCallahan Order by不是必需的。。。排号部分可以帮你。哦,我现在明白了。从from返回什么值并不重要,只要您拥有正确的值数即可。很好,真的吗?旧式连接?@SMor在这种情况下真的很重要吗?如果要使用TOP,您不需要订购吗?在这种情况下,答案是正确的,但不能保证。@EdCallahan Order by不是必需的。。。排号部分可以帮你。哦,我现在明白了。从from返回什么值并不重要,只要您拥有正确的值数即可。很好。我应该强调一下实际拥有一个数字表的有用性+1即使有了数字表,我的系统上的“顶”和“行”数字策略也会表现得更好。我们的数字表相当大,将近8000万行,所以这是一个因素。在我的系统上,WHERE语句导致索引查找,而TOP语句导致扫描。由于结果集的相对大小与索引大小的相对大小,扫描在百分比上执行得更好,在实际时间内,它们执行得很好。YMMV取决于数字表的大小等。80MM似乎有点过大,但我怀疑总比太小好。n1,n2将产生最多63毫米的观测值,我应该强调实际拥有数字表的有用性+1即使有了数字表,我的系统上的“顶”和“行”数字策略也会表现得更好。我们的数字表相当大,将近8000万行,所以这是一个因素。在我的系统上,WHERE语句导致索引查找,而TOP语句导致扫描。由于结果集的相对大小与索引大小的相对大小,扫描在百分比上执行得更好,在实际时间内,它们执行得很好。YMMV取决于数字表的大小等。80MM似乎有点过大,但我怀疑总比太小好。n1和n2将产生最大63MM的观测值,
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
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)