SQL SERVER Group Datetimestamps по месяцам - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть интервал (значение) каждые 15 минут за последние 3 года.Тип данных для метки datetime: datetimeoffset (7).Отметка даты и времени для каждого интервала должна интерпретироваться как конец периода времени.

Например, значение 1.96 в отметке даты и времени 2017-01-01 00: 00: 00.0000000 +01: 00 - это период с 2016-12-31 23: 45: 00.0000000 +01: 00 до 2017-01-01 00: 00: 00.0000000 +01: 00

DateTime                            Value
2016-12-31 23:00:00.0000000 +01:00  2.0000000000
2016-12-31 23:15:00.0000000 +01:00  1.9600000000
2016-12-31 23:30:00.0000000 +01:00  2.0400000000
2016-12-31 23:45:00.0000000 +01:00  2.0000000000
2017-01-01 00:00:00.0000000 +01:00  1.9600000000
2017-01-01 00:15:00.0000000 +01:00  2.1200000000
2017-01-01 00:30:00.0000000 +01:00  2.0800000000
2017-01-01 00:45:00.0000000 +01:00  2.0000000000
2017-01-01 01:00:00.0000000 +01:00  2.0000000000

Я бы хотел узнать сумму за месяц.Приведенный ниже запрос дает мне неверные результаты, поскольку отметка даты и времени 2017-01-01 00: 00: 00.0000000 +01: 00 добавлена ​​к январю 2017 года вместо декабря 2016 года.

SELECT Year([datetimestamp])  AS [Year], 
       Month([datetimestamp]) AS [Month], 
       Sum([value])           AS [Total] 
FROM   [data] 
GROUP  BY Year([datetimestamp]), 
          Month([datetimestamp]) 
ORDER  BY [year], 
          [month]

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Возможно, вам будет проще выразить

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

Вы также можете найти FORMAT() удобным:

SELECT FORMAT(dts_start, 'yyyy-MM') AS yyyymm,
       SUM([Value]) AS [Total]
FROM data CROSS APPLY
     (VALUES (DATEADD(minute, -15, datetimestamp)) as v(dts_start)
GROUP BY FORMAT(dts_start, 'yyyy-MM')
ORDER BY yyyymm;
0 голосов
/ 12 ноября 2018

Так что, если вы вычтете минуту, то вы получите правильный год и месяц для группы?

SELECT 
 YEAR(Dt) AS [Year],
 MONTH(Dt) AS [Month],
 SUM([Value]) AS [Total]
FROM (
  SELECT
   DATEADD(MINUTE, -1, [datetimestamp]) AS Dt,
   [Value]
  FROM [data]
) q
GROUP BY YEAR(Dt), MONTH(Dt)
ORDER BY [Year], [Month];

Или без подзапроса

SELECT 
 YEAR(DATEADD(MINUTE, -1, [datetimestamp])) AS [Year],
 MONTH(DATEADD(MINUTE, -1, [datetimestamp])) AS [Month],
 SUM([Value]) AS [Total]
FROM [data]
GROUP BY YEAR(DATEADD(MINUTE, -1, [datetimestamp])), 
         MONTH(DATEADD(MINUTE, -1, [datetimestamp]))
ORDER BY [Year], [Month];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...