¿Es posible escribir una consulta de Microsoft SQL que se agrupe por un tipo de datos datetime
pero ignorando la parte de hora como la hora y el minuto?Agrupar por fecha y hora ignorar la parte
Respuesta
Si está en SQL Server 2008, esto es simple.
GROUP BY CAST(YourCol AS Date)
Para las versiones anteriores se puede utilizar
GROUP BY DATEDIFF(DAY, 0, YourCol)
Sin embargo ninguno de ellos será capaz de aprovechar el hecho de que un índice en YourCol
que es ordenado por datetime
también se ordenarán por date
y por lo tanto utilizar un agregado de flujo sin una operación de clasificación.
En SQL Server 2008+ puede considerar indexar (date,time)
en lugar de datetime
para facilitar este tipo de consulta.
Ya sea por simplemente almacenarla como dos componentes separados y posiblemente proporcionar una columna calculada que se recombina las partes (a datetime2
se almacena el mismo que una date
y una time
por lo que este no consumirá más espacio excepto si el adicional la columna empuja el NULL_BITMAP
en un nuevo byte).
CREATE TABLE T
(
YourDateCol date,
YourTimeCol time,
YourDateTimeCol AS DATEADD(day,
DATEDIFF(DAY,0,YourDateCol),
CAST(YourTimeCol AS DATETIME2(7)))
/*Other Columns*/
)
O, alternativamente, se podría almacenar combinó en la tabla de base y tienen los índices calculados utilizan columnas que dividen a cabo.
Un ejemplo de este enfoque
CREATE TABLE T
(
DT DATETIME2,
D AS CAST(DT AS DATE),
T AS CAST(DT AS TIME)
)
CREATE INDEX IX1 ON T(DT);
SELECT COUNT(*),
CAST(DT AS DATE)
FROM T
GROUP BY CAST(DT AS DATE)
CREATE INDEX IX2 ON T(D,T);
SELECT COUNT(*),
CAST(DT AS DATE)
FROM T
GROUP BY CAST(DT AS DATE)
DROP TABLE T
'GROUP BY DATEDIFF (DAY, 0, YourCol)' probablemente también sea suficiente en este caso ... – Tomalak
@Tomalak - Buen punto. Eso devolverá un 'int' que es suficiente para' group by' y no hay razón para convertir de nuevo a 'datetime' excepto para fines de visualización. –
Si usted tiene una mesa grande y desea agrupar a suceder rápido, no se puede confiar en la agrupación de una expresión.
Crear una columna de fecha y hora adicional en su mesa y lo han llenado por un disparador que calcula la fecha de base desde la que "real" fecha:
UPDATE
MyTable
SET
EffectiveDate = DATEADD(DAY, 0, DATEDIFF(DAY, 0, t.RecordDate))
FROM
MyTable t
INNER JOIN inserted i ON i.RowID = t.RowID
a continuación, poner un índice en EffectiveDate
y agrupar (y búsqueda) será mucho más rápido.
Para el lanzamiento de SQL Server 2008 por fecha [es sargable] (http://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable) aunque no he comprobado si esto se aprovecha en 'group by' consultas. –
@Martin Interesante, no lo sabía. Pero todavía activaría un escaneo de tabla cuando no hay un índice en la columna, ¿no es así? – Tomalak
¿Por qué un disparador y no una columna calculada? 'EffectiveDate COMO CONVERTIR (DATETIME, DATEADD (DAY, 0, DATEDIFF (DAY, 0, t.RecordDate)))' - esta columna podría ser persistente e indexada también para eliminar cualquier duda sobre la sargabilidad, sin pagar la sobrecarga de un desencadenar. –
- 1. raíles 3 agrupar por fecha una columna de fecha y hora
- 2. Agrupar por hora usando LINQ
- 3. de fecha y hora
- 4. ¿Cómo puedo agrupar por mes y año cuando solo tengo un campo de fecha y hora?
- 5. LINQ: Agrupar por mes y año dentro de un campo de fecha y hora
- 6. Seleccionar y agrupar filas en resumen por hora
- 7. SQLAlchemy: Cómo agrupar por dos campos y filtrar por fecha
- 8. ¿Cómo comparar momento parte de fecha y hora
- 9. Python: obtener la fecha y hora de la última hora
- 10. MySQL: Cómo agrupar datos por hora y obtener la última hora
- 11. Django grupo de modelos por fecha de fecha y hora
- 12. Compilar fecha y hora
- 13. C++ fecha y hora
- 14. Fecha y hora en java
- 15. fecha y la fecha y hora en Django
- 16. Obtener Fecha y hora actual y el tiempo con [fecha NSDate] fecha y hora
- 17. Establecer la parte del tiempo de la variable de fecha y hora en 18:00
- 18. Python 3: fecha y hora a fecha y hora: ¿de dónde viene esta hora adicional?
- 19. ¿Cómo obtener la fecha y hora actual?
- 20. Mysql insertar fecha y hora aleatorias en un rango de fecha y hora dado
- 21. Django: quiero ordenar los comentarios por fecha y hora
- 22. Rieles: Obtenga la hora de una fecha y hora
- 23. Formato Excepción: fecha y hora
- 24. Cómo obtengo la Fecha y hora (VBS)
- 25. Fecha y hora en donde la cláusula
- 26. Cambiar la fecha y hora en MusicSequence
- 27. Cómo obtener la fecha y hora del sello de fecha y hora
- 28. Selector de fecha y hora: configuración de la fecha y hora de apertura
- 29. Como llegar hora y la fecha del sello de fecha y hora en php
- 30. ¿Cómo comparar solo la fecha sin hora en tipos de fecha y hora en Linq a SQL con Entity Framework?
¿Qué versión de SQL Server? Importa para esta pregunta en particular. (es * posible * en todas las versiones de SQL Server, pero hay una mejor solución en 2008+) – RBarryYoung
posible duplicado de [Cómo truncar una fecha y hora en SQL Server] (http://stackoverflow.com/questions/923295/ how-to-truncate-a-datetime-in-sql-server) y [muchos otros] (http://www.google.com/cse?cx=018205968162215846785%3A7n6ajnwyz-i&ie=UTF-8&q=sql+server+ truncate +% 28datetime | time% 29 & sa = Search & siteurl = www.google.com% 2Fcse% 2Fhome% 3Fcx% 3D018205968162215846785% 3A7n6ajnwyz-i) –
@AndriyM - Agrupar por la parte 'date' de' datetime' presenta un problema de optimización específico más allá de solo truncar la parte de la fecha. p.ej. comparar los planes para 'CREAR TABLA T1 (D DATETIME2 PRIMARY KEY); CREAR TABLA T2 (D DATE, T TIME, PRIMARY KEY (D, T)); SELECCIONAR COUNT (*) FROM T1 GROUP BY CAST (D AS DATE) OPCIÓN (GRUPO DE PEDIDO); SELECCIONE CUENTA (*) DEL GRUPO T2 POR D OPCIÓN (GRUPO DE PEDIDOS) ' –