Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Групирайте DateTime в интервали от 5, 15, 30 и 60 минути

Използване на

datediff(minute, '1990-01-01T00:00:00', yourDatetime)

ще ви даде броя минути от 1990-1-1 (можете да използвате желаната базова дата).

След това можете да разделите на 5, 15, 30 или 60 и да групирате по резултата от това деление. Проверих, че ще бъде оценено като цяло число, така че ще получите цяло число, което можете да използвате за групиране.

т.е.

group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5

АКТУАЛИЗИРАНЕ Тъй като първоначалният въпрос беше редактиран, за да изисква данните да се показват във формат дата-време след групирането, добавих тази проста заявка, която ще направи това, което OP иска:

-- This convert the period to date-time format
SELECT 
    -- note the 5, the "minute", and the starting point to convert the 
    -- period back to original time
    DATEADD(minute, AP.FiveMinutesPeriod * 5, '2010-01-01T00:00:00') AS Period,
    AP.AvgValue
FROM
    -- this groups by the period and gets the average
    (SELECT
        P.FiveMinutesPeriod,
        AVG(P.Value) AS AvgValue
    FROM
        -- This calculates the period (five minutes in this instance)
        (SELECT 
            -- note the division by 5 and the "minute" to build the 5 minute periods
            -- the '2010-01-01T00:00:00' is the starting point for the periods
            datediff(minute, '2010-01-01T00:00:00', T.Time)/5 AS FiveMinutesPeriod,
            T.Value
        FROM Test T) AS P
    GROUP BY P.FiveMinutesPeriod) AP

ЗАБЕЛЕЖКА:Разделих това на 3 подзаявки за яснота. Трябва да го прочетете отвътре навън. Може, разбира се, да бъде написано като единична компактна заявка

ЗАБЕЛЕЖКА:ако промените периода и началната дата-час, можете да получите всеки интервал, от който се нуждаете, като седмици, започващи от даден ден, или каквото ви е необходимо

Ако искате да генерирате тестови данни за тази заявка, използвайте това:

CREATE TABLE Test
( Id INT IDENTITY PRIMARY KEY,
Time DATETIME,
Value FLOAT)

INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:00:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:03:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:04:45', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:07:21', 20)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:10:25', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:11:22', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:14:47', 30)

Резултатът от изпълнението на заявката е следният:

Period                     AvgValue
2012-03-22 00:00:00.000    10
2012-03-22 00:05:00.000    20
2012-03-22 00:10:00.000    30


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Автоматизиране на дефрагментацията на индекса в базата данни на MS SQL Server

  2. Върнете информация за версията на операционната система в SQL Server с динамичния изглед за управление sys.dm_os_host_info

  3. Одит на данни в NHibernate и SqlServer

  4. Как да конвертирате главни в малки букви в SQL Server – LOWER()

  5. Как да направите UPDATE Pass-Through заявка в SQL Server