如何生成小时数并在sql表中填充一段时间

如何生成小时数并在sql表中填充一段时间,sql,sql-server,database,Sql,Sql Server,Database,如何创建一个表,其中列的日期、小时作为一个单独的字段,时间段为10年,从2010年1月1日到2020年1月1日 我已创建了参考url的日历表: 它只生成日期、天、周、月,但不生成时间。 我想生成一个新列,值为0,…每天23小时。创建一个时间表和日历表。你的时间具体到什么程度取决于你(例如,我的每一秒都有一个值)。然后,将simple连接到: SELECT * --Yes, * is bad, but I don't know what the OP's Columns are.

如何创建一个表,其中列的日期、小时作为一个单独的字段,时间段为10年,从2010年1月1日到2020年1月1日

我已创建了参考url的日历表:

它只生成日期、天、周、月,但不生成时间。
我想生成一个新列,值为0,…每天23小时。

创建一个时间表和日历表。你的时间具体到什么程度取决于你(例如,我的每一秒都有一个值)。然后,将simple
连接到

SELECT * --Yes, * is bad, but I don't know what the OP's Columns are.
         --The OP will need to replace the * with the appropriate columns
FROM CalendarTable CT
     JOIN TimeTable TT ON TT.[Minutes] = 0 AND TT.[Seconds] = 0
WHERE CT.DateValue >= '20100101'
  AND CT.DateValue < '20200102';
SELECT*--Yes,*不好,但我不知道OP的列是什么。
--OP需要将*替换为相应的列
从日历表CT
在TT.[Minutes]=0和TT.[Seconds]=0上加入时间表TT
其中CT.DateValue>='20100101'
和CT.DateValue<'20200102';
过滤器意味着只返回小时值


另外,值得注意的是,一天中没有24小时。时间是0-23小时,而不是1-24小时。

创建时间表和日历表。你的时间具体到什么程度取决于你(例如,我的每一秒都有一个值)。然后,将simple
连接到

SELECT * --Yes, * is bad, but I don't know what the OP's Columns are.
         --The OP will need to replace the * with the appropriate columns
FROM CalendarTable CT
     JOIN TimeTable TT ON TT.[Minutes] = 0 AND TT.[Seconds] = 0
WHERE CT.DateValue >= '20100101'
  AND CT.DateValue < '20200102';
SELECT*--Yes,*不好,但我不知道OP的列是什么。
--OP需要将*替换为相应的列
从日历表CT
在TT.[Minutes]=0和TT.[Seconds]=0上加入时间表TT
其中CT.DateValue>='20100101'
和CT.DateValue<'20200102';
过滤器意味着只返回小时值


另外,值得注意的是,一天中没有24小时。小时数为0-23,而不是1-24。

创建另一个表,该表为一天中的每小时容纳24行,或者使用类似的派生表

SELECT
     H.[Hour]
    ,D.[Date] 
FROM
    dbo.DateDimension D
CROSS APPLY
(   --Derived table with 24 rows
    SELECT
        [Hour] = V.number
    FROM
        master..spt_values V
    WHERE
        V.type = 'P'
    AND
        V.number >= 1 AND V.number <= 24
) H
WHERE
    [D].[Date] = '2000-01-01'
选择
H.[小时]
,D.[日期]
从…起
dbo.D
交叉应用
(-)包含24行的派生表
挑选
[小时]=V.number
从…起
标准贯入度值
哪里
V.type='P'
及

V.number>=1和V.number或者创建另一个表,该表在一天中的每小时容纳24行,或者像这样使用派生表

SELECT
     H.[Hour]
    ,D.[Date] 
FROM
    dbo.DateDimension D
CROSS APPLY
(   --Derived table with 24 rows
    SELECT
        [Hour] = V.number
    FROM
        master..spt_values V
    WHERE
        V.type = 'P'
    AND
        V.number >= 1 AND V.number <= 24
) H
WHERE
    [D].[Date] = '2000-01-01'
选择
H.[小时]
,D.[日期]
从…起
dbo.D
交叉应用
(-)包含24行的派生表
挑选
[小时]=V.number
从…起
标准贯入度值
哪里
V.type='P'
及

V.number>=1和V.number您可以用另一种简单的方法实现它,如下所示

;WITH CTE AS (
SELECT NUMBER FROM master.dbo.spt_values where TYPE='P' AND NUMBER BETWEEN 1 AND 2047
)
, YEARS AS(
SELECT NUMBER+2009 AS  Y FROM CTE WHERE NUMBER BETWEEN 1 AND 11
)
,MONTHS AS (
SELECT NUMBER AS M FROM CTE WHERE NUMBER BETWEEN 1 AND 12
)
,DAYSS AS(
    SELECT NUMBER AS D FROM CTE WHERE NUMBER BETWEEN 1 AND 31
)
,HRS AS (
    SELECT NUMBER AS H FROM CTE WHERE NUMBER BETWEEN 1 AND 24
)
SELECT * FROM YEARS Y
CROSS APPLY MONTHS M
CROSS APPLY (SELECT  D FROM DAYSS 
WHERE D<= DATEDIFF(DD,DATEFROMPARTS(Y.Y, M.M,01),DATEADD(MM,1, DATEFROMPARTS(Y.Y, M.M,01))))D
CROSS APPLY HRS H
ORDER BY Y.Y, M.M, D.D, H.H
注意:
DATEFROMPARTS
函数仅适用于SQL Server 2012和 您可以通过浓缩它们并转换为日期来替换它 用于较低版本的字段


您可以通过另一种简单的方式实现它,如下所示

;WITH CTE AS (
SELECT NUMBER FROM master.dbo.spt_values where TYPE='P' AND NUMBER BETWEEN 1 AND 2047
)
, YEARS AS(
SELECT NUMBER+2009 AS  Y FROM CTE WHERE NUMBER BETWEEN 1 AND 11
)
,MONTHS AS (
SELECT NUMBER AS M FROM CTE WHERE NUMBER BETWEEN 1 AND 12
)
,DAYSS AS(
    SELECT NUMBER AS D FROM CTE WHERE NUMBER BETWEEN 1 AND 31
)
,HRS AS (
    SELECT NUMBER AS H FROM CTE WHERE NUMBER BETWEEN 1 AND 24
)
SELECT * FROM YEARS Y
CROSS APPLY MONTHS M
CROSS APPLY (SELECT  D FROM DAYSS 
WHERE D<= DATEDIFF(DD,DATEFROMPARTS(Y.Y, M.M,01),DATEADD(MM,1, DATEFROMPARTS(Y.Y, M.M,01))))D
CROSS APPLY HRS H
ORDER BY Y.Y, M.M, D.D, H.H
注意:
DATEFROMPARTS
函数仅适用于SQL Server 2012和 您可以通过浓缩它们并转换为日期来替换它 用于较低版本的字段


我认为最好用1..24小时制作另一张表。然后将两张表(仅小时+日期)都包含在
的WHERE
中,并包含所有组合。如果您解释为什么要这样做,您可能会得到更好的建议。我认为最好用1..24小时制作另一张表。然后将两张表(仅小时+日期)都包含在内在
中,其中
将包含所有组合。如果您解释为什么要这样做,您可能会得到更好的建议。