【问题标题】:How to generate hours and populate in sql table for a period如何生成小时数并在 sql 表中填充一段时间
【发布时间】:2018-06-26 03:31:06
【问题描述】:

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

我创建了引用 url 的日历表: click here

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

【问题讨论】:

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

标签: sql sql-server database


【解决方案1】:

您可以通过以下另一种简单的方法实现它

;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

示例结果:

+------+---+----+----+
|  Y   | M | D  | H  |
+------+---+----+----+
| --   | - | -- | -- |
| 2020 | 2 | 29 | 21 |
| 2020 | 2 | 29 | 22 |
| 2020 | 2 | 29 | 23 |
| 2020 | 2 | 29 | 24 |
| 2020 | 3 |  1 |  1 |
| 2020 | 3 |  1 |  2 |
| 2020 | 3 |  1 |  3 |
| --   | --| -- | -- |
+------+---+----+----+

注意:DATEFROMPARTS 函数仅适用于 SQL Server 2012 和 更多。您可以通过连接它们并转换为日期来替换它 较低版本的字段。

【讨论】:

    【解决方案2】:

    要么创建另一个表,在一天中的每个小时保存 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'
    

    输出

    【讨论】:

      【解决方案3】:

      创建时间表以及日历表。你的时间有多具体取决于你(例如,我的时间是一天中每一秒的值)。然后,简单的JOIN 也可以:

      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';
      

      过滤器意味着只返回 Hour 值。

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

      【讨论】:

        猜你喜欢
        • 2011-09-01
        • 1970-01-01
        • 2015-06-05
        • 2021-05-09
        • 2019-09-03
        • 2023-03-07
        • 2023-01-10
        • 2020-08-18
        • 1970-01-01
        相关资源
        最近更新 更多