например, когда я делаю
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. можно ли сделать вывод даты без миллисекунд?
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
так, чтобы, когда я смотрю на данные, они коррелировали с ближайшим временным интерваломDATE(DT.[Date])
.datepart(hour, workingPolicy.workingHours)/2.0
дает1.5
покаdatepart(hour, '1900-01-01 09:00:30.000')/2.0
дает4.5
, я не понимаю почему? Примечание: workingPolicy.workingHours = 1900-01-01 09: 00: 30.000 . пожалуйста, помогитеЯ супер опоздал на вечеринку, но это не отражено ни в одном из существующих ответов:
10
ИMINUTE
сроки могут быть изменены в любое число иDATEPART
, соответственно.DATETIME
значение, которое означает:SELECT
оператор даст вашему выводу столбец с довольно усеченным выводом на указанном вами уровне.'2000'
является «якорной датой», вокруг которой SQL будет выполнять математическую обработку даты. Джереон обнаружил ниже, что вы сталкиваетесь с целочисленным переполнением с предыдущей привязкой (0
), когда вы группируете последние даты по секундам или миллисекундам. †Если ваши данные пролетами века, ‡ используя одну дату привязки для второго или миллисекунды группировка по- прежнему будет сталкиваться переполнения. Если это происходит, вы можете попросить каждую строку привязать сравнение биннинга к полуночи его собственной даты:
Используйте
DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
вместо того,'2000'
где он появляется выше. Ваш запрос будет полностью нечитаемым, но он будет работать.Альтернативой может быть
CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
замена.† 2 32 ≈ 4.29E + 9, так что если у вас
DATEPART
естьSECOND
, вы получите 4,3 миллиарда секунд с каждой стороны, или «якорь ± 136 лет». Аналогично, 2 32 миллисекунды - это ≈ 49,7 дня.‡ Если ваши данные на самом деле пролеты веков или Millenia и является до сих пор с точностью до секунды или миллисекунды ... поздравляем! Что бы вы ни делали, продолжайте делать это.
источник
where
пункт передgroup by
./ 20 * 20
будет таким же, как сбор данных за 20-минутные интервалы? Извините, я сейчас борюсь с математикой.The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
). Кажется, что MINUTE - самая маленькая часть даты, которую вы можете использовать с этим подходом.0
в'2000'
(кавычки важны!) и попробуйтеSECOND
еще раз.В T-SQL вы можете:
или
по минутному использованию
DATEPART(mi, [Date])
или
на 10 минут использования
DATEPART(mi, [Date]) / 10
(как предложил Тимоти)источник
За 10-минутный интервал вы бы
Как уже упоминалось tzup и Pieter888 ... сделать часовой интервал, просто
источник
Должно быть что-то вроде
(Не уверен на 100% в синтаксисе - я скорее парень из Oracle)
В Oracle:
источник
Оригинальный ответ автор дал работы довольно хорошо. Просто чтобы расширить эту идею, вы можете сделать что-то вроде
что позволит вам группировать более длительный период, чем 60 минут, скажем, 720, что составляет полдня и т. д.
источник
Для MySql:
источник
Мое решение состоит в том, чтобы использовать функцию для создания таблицы с интервалами дат, а затем присоединить эту таблицу к данным, которые я хочу сгруппировать, используя интервал дат в таблице. Интервал даты может быть легко выбран при представлении данных.
источник
источник
Для SQL Server 2012, хотя я считаю, что он будет работать в SQL Server 2008R2, я использую следующий подход, чтобы сократить время до миллисекунды:
Это работает:
@ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
@rms = @ms % @msPerSlice
DATEADD(MILLISECOND, -@rms, time)
К сожалению, поскольку это переполняется микросекундами и меньшими единицами, таким образом, более крупные, более тонкие наборы данных должны будут использовать менее удобную фиксированную точку.
Я не проводил строгих тестов, и у меня нет больших данных, так что ваш пробег может отличаться, но производительность была не заметно хуже, чем у других методов, опробованных на нашем оборудовании и наборах данных, а выплата за удобство для разработчиков для произвольной нарезки делает его стоящим для нас.
источник
замените два 600 на любое количество секунд, которые вы хотите сгруппировать.
Если вам это нужно часто, и таблица не меняется, как следует из названия Archive, вероятно, было бы немного быстрее преобразовать и сохранить дату (и время) как unixtime в таблице.
источник
Я знаю, что опоздал на шоу с этим, но я использовал это - довольно простой подход. Это позволяет получить 60-минутные срезы без проблем с округлением.
источник
источник