Нужно вычислять по округленному времени или дате в 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