【问题标题】:SQL SERVER Group Datetimestamps by custom periodSQL SERVER 按自定义时间段分组日期时间戳
【发布时间】:2019-04-15 17:09:41
【问题描述】:

我有过去 3 年每 60 分钟的间隔数据 (Value)。时间戳的数据类型是datetimeoffset(7)。每个时间间隔的时间戳代表时间段的结束。

例如,时间戳2016-12-31 07:00:00.0000000 +01:00 处的值323.459 是从2016-12-31 06:00:00.0000000 +01:002016-12-31 07:00:00.0000000 +01:00 的时间段。以下是更多示例数据:

DateTime                             Value
2016-12-31 06:00:00.0000000 +01:00   314.5300000000
2016-12-31 07:00:00.0000000 +01:00   323.4590000000
2016-12-31 08:00:00.0000000 +01:00   314.3110000000
2016-12-31 09:00:00.0000000 +01:00   611.7280000000
2016-12-31 10:00:00.0000000 +01:00   507.1300000000
2016-12-31 11:00:00.0000000 +01:00   533.3160000000
2016-12-31 12:00:00.0000000 +01:00   524.4510000000
2016-12-31 13:00:00.0000000 +01:00   507.0540000000
2016-12-31 14:00:00.0000000 +01:00   498.2340000000
2016-12-31 15:00:00.0000000 +01:00   507.0230000000
2016-12-31 16:00:00.0000000 +01:00   498.1710000000
2016-12-31 17:00:00.0000000 +01:00   506.9680000000
2016-12-31 18:00:00.0000000 +01:00   506.9730000000
2016-12-31 19:00:00.0000000 +01:00   507.0090000000
2016-12-31 20:00:00.0000000 +01:00   498.2780000000
2016-12-31 21:00:00.0000000 +01:00   463.2640000000
2016-12-31 22:00:00.0000000 +01:00   507.0490000000
2016-12-31 23:00:00.0000000 +01:00   454.7290000000
2017-01-01 00:00:00.0000000 +01:00   419.7010000000
2017-01-01 01:00:00.0000000 +01:00   628.9020000000
2017-01-01 02:00:00.0000000 +01:00   541.9210000000
2017-01-01 03:00:00.0000000 +01:00   533.1670000000
2017-01-01 04:00:00.0000000 +01:00   515.5930000000
2017-01-01 05:00:00.0000000 +01:00   454.7160000000
2017-01-01 06:00:00.0000000 +01:00   445.8340000000

我想知道每个月的总数。所以 2017 年 1 月期间将使用这些日期:
2017-01-01 06:00:00.0000000 +01:002017-02-01 06:00:00.0000000 +01:00

2017 年 2 月受以下日期限制:
2017-02-01 06:00:00.0000000 +01:002017-03-01 06:00:00.0000000 +01:00

这些都是例子。我想知道我的数据集中所有月份的总数。如何编写查询以获取按月分组的 Value 列的总数?

【问题讨论】:

    标签: sql sql-server datetime group-by


    【解决方案1】:

    只需减去 6 小时并进行计算:

    SELECT YEAR(dts_start) AS [Year],
           MONTH(dts_start) AS [Month],
           SUM([Value]) AS [Total]
    FROM data CROSS APPLY
         (VALUES (DATEADD(hour, -6, datetimestamp)) as v(dts_start)
    GROUP BY YEAR(dts_start), MONTH(dts_start)
    ORDER BY [Year], [Month];
    

    【讨论】:

    • 怎么不行?这样的评论不是很有帮助。
    • 嗨,戈登,对不起,你是对的,它确实可以提取 7 小时。您的第一个回复是减去 18 小时,这没有用。我有没有提到你很棒? :-) 非常感谢。
    • 嗨@GordonLinoff,很好的答案!你能在stackoverflow.com/questions/57266450/…查看我的问题吗?真的可以使用你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多