Как сгруппировать время по часам или по 10 минут - PullRequest
150 голосов
/ 15 февраля 2011

как когда я делаю

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date]

как я могу указать групповой период?

MS SQL 2008

2-е редактирование

Я пытаюсь

SELECT MIN([Date]) AS RecT, AVG(Value)
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY (DATEPART(MINUTE, [Date]) / 10)
  ORDER BY RecT

изменено% 10 на / 10. возможно ли сделать вывод даты без миллисекунд?

Ответы [ 12 ]

0 голосов
/ 24 сентября 2016

Для SQL Server 2012, хотя я считаю, что он будет работать в SQL Server 2008R2, я использую следующий подход, чтобы сократить время до миллисекунды:

DATEADD(MILLISECOND, -DATEDIFF(MILLISECOND, CAST(time AS DATE), time) % @msPerSlice, time)

Работает:

  • Получение количества миллисекунд между фиксированной точкой и целевым временем:
    @ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
  • Взяв остаток от деления этих миллисекунд на временные интервалы:
    @rms = @ms % @msPerSlice
  • Добавление отрицательного значения этого остатка к целевому времени для получения времени среза:
    DATEADD(MILLISECOND, -@rms, time)

К сожалению, так как это переполняется микросекундами и меньшими единицами, таким образом, более крупные, более тонкие наборы данных должны использовать менее удобную фиксированную точку.

Я не проводил строгих сравнительных тестов, и у меня нет больших данных, поэтому ваш пробег может отличаться, но производительность была не намного хуже, чем у других методов, опробованных на нашем оборудовании и наборах данных, а также за удобство для разработчиков для произвольной нарезки делает это стоящим для нас.

0 голосов
/ 14 января 2014

Мое решение - использовать функцию для создания таблицы с интервалами дат, а затем присоединить эту таблицу к данным, которые я хочу сгруппировать, используя интервал дат в таблице.Интервал даты может быть легко выбран при представлении данных.

CREATE FUNCTION [dbo].[fn_MinuteIntervals]
    (
      @startDate SMALLDATETIME ,
      @endDate SMALLDATETIME ,
      @interval INT = 1
    )
RETURNS @returnDates TABLE
    (
      [date] SMALLDATETIME PRIMARY KEY NOT NULL
    )
AS
    BEGIN
        DECLARE @counter SMALLDATETIME
        SET @counter = @startDate
        WHILE @counter <= @endDate
            BEGIN
                INSERT INTO @returnDates VALUES ( @counter )
                SET @counter = DATEADD(n, @interval, @counter)
            END
        RETURN
    END
...