2012-01-04 7 views
6

tengo 2 columnas de datos en MS SQL 2008necesidad de calcular el tiempo redondeada o figura de la fecha en SQL Server

columna uniqueidentifier como identificación y una columna de fecha y hora con algunos resultados como sigue.

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 

Aparte de la complejidad de la columna ID. Sólo estoy interesado en la agrupación de los datos de intervalos basados ​​om por

minutes(1,5,10,15,30) 
hours (1,2) 
days(1,5,10) 
months(1,2) 

Los resultados deben ser solado o de otra manera para producir sólo el 1 por intervalo única En la siguiente manera

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) 

O por día

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) 

etc.

Cualquier sugerencia constructiva sería bienvenida.

Respuesta

25

Puede utilizar la misma técnica para redondear a cualquier intervalo de fecha. Esto se basa en la división entera

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; 
+0

Eso es simplemente genial, y una forma muy clara de lograr esto. Debo decir que ojalá hubiera algo incorporado para lograrlo, pero bueno, tu enfoque funciona. –

1

Suponiendo, que MyDateTime

su columna DateTime llamado así por minuto

aunque sólo plantas ha

SELECT DISTINCT DATEADD(MINUTE, DATEPART(minute, mydatetime), DATEADD(HOUR, DATEPART(HOUR, mydatetime), CONVERT(varchar, mydatetime, 112))) 
from YourTable 

si redondeada, entonces es mucho más simple

select DISTINCT CAST(mydatetime as smalldatetime) 
from YourTable 

Durante horas en la manera parecida

durante días

select DISTINCT CAST(CONVERT(varchar, mydatetime, 112) as date) 
from YourTable 

durante meses

select DISTINCT DATEADD(DAY, 1-DAY(mydatetime), CONVERT(varchar, mydatetime, 112)) 
from YourTable 
+0

¿Qué pasa con los otros intervalos)? También vea http://stackoverflow.com/a/1177529/27535 sobre las mejores formas de hacerlo – gbn

+0

vea la respuesta de @gbn, es más universal –

Cuestiones relacionadas