Нужно вычислять по округленному времени или дате в sql-сервере
У меня есть 2 столбца данных в Ms Sql 2008
столбец uniqueidentifier как идентификатор и столбец datetime с несколькими результатами, как показано ниже.
2011-11-06 18:02:18.030
2011-11-06 18:02:18.373
2011-11-06 18:02:57.560
2011-11-06 18:02:58.593
2011-11-06 18:03:01.717
2011-11-06 18:03:02.373
2011-11-06 18:03:03.407
Помимо сложности столбца идентификатора.
Меня интересует только группировка интервалов om на основе данных за
minutes(1,5,10,15,30)
hours (1,2)
days(1,5,10)
months(1,2)
Результаты должны быть полными или другими, чтобы дать только 1 уникальный за интервал
Как следует
2011-11-06 18:02:00 (1 Minute)
2011-11-06 18:03:00 (1 Minute)
2011-11-06 18:04:00 (1 Minute)
2011-11-06 18:05:00 (1 Minute)
2011-11-06 18:06:00 (1 Minute)
Или в день
2011-11-06 00:00:00 (1 Day)
2011-11-07 00:00:00 (1 Day)
2011-11-08 00:00:00 (1 Day)
2011-11-09 00:00:00 (1 Day)
2011-11-10 00:00:00 (1 Day)
и др.
Любые конструктивные предложения будут приветствоваться.
Ответы
Ответ 1
Вы можете использовать ту же технику для округления до любого интервала дат. Это зависит от целочисленного деления
SELECT
DATEADD(minute, DATEDIFF(minute, 0, foo), 0), -- whole minute
DATEADD(minute, DATEDIFF(minute, 0, foo) / 5 * 5, 0), -- 5 minute
DATEADD(minute, DATEDIFF(minute, 0, foo) / 10 * 10, 0), -- 10 minute
DATEADD(minute, DATEDIFF(minute, 0, foo) / 15 * 15, 0), -- 15 minute
DATEADD(minute, DATEDIFF(minute, 0, foo) / 30 * 30, 0), -- 30 minute
DATEADD(hour, DATEDIFF(hour, 0, foo), 0), -- whole hour
DATEADD(hour, DATEDIFF(hour, 0, foo) / 2 * 2, 0), -- 2 hour
DATEADD(day, DATEDIFF(day, 0, foo), 0), -- whole day
DATEADD(day, DATEDIFF(day, 0, foo) / 5 * 5, 0), -- 5 day
DATEADD(day, DATEDIFF(day, 0, foo) / 10 * 10, 0), -- 10 day
DATEADD(month, DATEDIFF(month, 0, foo), 0), -- whole month
DATEADD(month, DATEDIFF(month, 0, foo) / 2 * 2, 0) -- 2 month
FROM
@dates;
Ответ 2
Предполагая, что столбец DateTime с именем mydatetime
В течение минут
если только настил
SELECT DISTINCT DATEADD(MINUTE, DATEPART(minute, mydatetime), DATEADD(HOUR, DATEPART(HOUR, mydatetime), CONVERT(varchar, mydatetime, 112)))
from YourTable
if ROUNDED, то это намного проще
select DISTINCT CAST(mydatetime as smalldatetime)
from YourTable
Часами
аналогичным образом
в течение дней
select DISTINCT CAST(CONVERT(varchar, mydatetime, 112) as date)
from YourTable
В течение месяцев
select DISTINCT DATEADD(DAY, 1-DAY(mydatetime), CONVERT(varchar, mydatetime, 112))
from YourTable