operaciones - La forma más eficiente en SQL Server para obtener la fecha de fecha+hora?
obtener mes y año de una fecha sql (11)
En MS SQL 2000 y 2005, dada una fecha y hora como ''2008-09-25 12:34:56'', ¿cuál es la forma más eficiente de obtener una fecha y hora que contenga solo ''2008-09-25''?
Duplicado here .
¿Qué pasa con SELECT CAST(CASt(GETDATE() AS int) AS DATETIME)
??
CONVERT, FLOOR y DATEDIFF funcionarán igual.
Cómo devolver la parte de fecha solo desde un tipo de datos datetime de SQL Server
Debo admitir que no había visto la conversión flotante mostrada por Matt antes. Tenía que probar esto.
Probé una selección pura (que devolverá Fecha y hora, y no es lo que queremos), la solución reinante aquí (floor-float), una común ''ingenua'' mencionada aquí (stringconvert) y la mencionada aquí que yo era usando (como pensé que era el más rápido).
Probé las consultas en un servidor de prueba MS SQL Server 2005 que se ejecuta en un servidor Win 2003 SP2 con una CPU Xeon 3GHz que se ejecuta en la memoria máxima (32 bits, eso es aproximadamente 3,5 Gb). Es de noche donde estoy, así que la máquina está funcionando sin carga casi sin carga. Lo tengo todo para mí.
Aquí está el registro de mi selección de ejecución de prueba de una tabla grande que contiene marcas de tiempo que varían hasta el nivel de milisegundo. Este conjunto de datos particular incluye fechas que abarcan más de 2,5 años. La tabla en sí tiene más de 130 millones de filas, por eso me limito al top million.
SELECT TOP 1000000 CRETS FROM tblMeasureLogv2
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2
Análisis SQL Server y tiempo de compilación: tiempo de CPU = 0 ms, tiempo transcurrido = 1 ms.
(1000000 fila (s) afectadas) Tabla ''tblMeasureLogv2''. Número de escaneo 1, lecturas lógicas 4752, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas de lob 0, lecturas físicas de lob 0, lecturas de lectura anticipada de lob 0.
Tiempos de ejecución de SQL Server: tiempo de CPU = 422 ms, tiempo transcurrido = 33803 ms.
(1000000 fila (s) afectadas) Tabla ''tblMeasureLogv2''. Número de escaneo 1, lecturas lógicas 4752, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas de lob 0, lecturas físicas de lob 0, lecturas de lectura anticipada de lob 0.
Tiempos de ejecución de SQL Server: tiempo de CPU = 625 ms, tiempo transcurrido = 33545 ms.
(1000000 fila (s) afectadas) Tabla ''tblMeasureLogv2''. Número de escaneo 1, lecturas lógicas 4752, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas de lob 0, lecturas físicas de lob 0, lecturas de lectura anticipada de lob 0.
Tiempos de ejecución de SQL Server: tiempo de CPU = 1953 ms, tiempo transcurrido = 33843 ms.
(1000000 fila (s) afectadas) Tabla ''tblMeasureLogv2''. Número de escaneo 1, lecturas lógicas 4752, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas de lob 0, lecturas físicas de lob 0, lecturas de lectura anticipada de lob 0.
Tiempos de ejecución de SQL Server: tiempo de CPU = 531 ms, tiempo transcurrido = 33440 ms. Análisis SQL Server y tiempo de compilación: tiempo de CPU = 0 ms, tiempo transcurrido = 1 ms.
Tiempos de ejecución de SQL Server: tiempo de CPU = 0 ms, tiempo transcurrido = 1 ms.
¿Qué estamos viendo aquí?
Centrémonos en el tiempo de la CPU (estamos viendo la conversión), y podemos ver que tenemos los siguientes números:
Pure-Select: 422
Floor-cast: 625
String-conv: 1953
DateAdd: 531
A partir de esto, me parece que DateAdd (al menos en este caso particular) es ligeramente más rápido que el método de lanzamiento de piso.
Antes de ir allí, realicé esta prueba varias veces, con el orden de las consultas cambiado, los mismos resultados.
¿Es esto algo extraño en mi servidor, o qué?
Para obtener AAAA-MM-DD, use:
select convert(varchar(10), getdate(), 120)
Editar: Vaya, quiere un DateTime en lugar de una cadena. El equivalente de TRUNC () en Oracle. Puede tomar lo que publiqué y devolver a DateTime:
select convert(datetime, convert(varchar(10), getdate(), 120) , 120)
Tres métodos descritos en el siguiente enlace. No he probado el rendimiento para determinar cuál es el más rápido.
en el uso de SQL Server 2012
select cast(getdate() as date)
CAST(FLOOR(CAST(yourdate AS DECIMAL(12, 5))) AS DATETIME)
tiene el mejor CAST(FLOOR(CAST(yourdate AS DECIMAL(12, 5))) AS DATETIME)
. Puede ver las pruebas y pruebas al obtener la fecha sin tiempo en el servidor sql
CONVERT(VARCHAR(10), GETDATE(), 120) AS [YYYY-MM-DD]
Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
DateDiff (Day, 0, GetDate ()) es lo mismo que DateDiff (Day, ''1900-01-01'', GetDate ())
Dado que DateDiff devuelve un número entero, obtendrá la cantidad de días transcurridos desde el 1 de enero de 1900. Luego, agregue ese número entero de días hasta el 1 de enero de 1900. El efecto neto es eliminar el componente de tiempo.
También debo mencionar que este método funciona para cualquier parte de fecha / hora (como año, trimestre, mes, día, hora, minuto y segundo).
Select DateAdd(Year, DateDiff(Year, 0, GetDate()), 0)
Select DateAdd(Quarter, DateDiff(Quarter, 0, GetDate()), 0)
Select DateAdd(Month, DateDiff(Month, 0, GetDate()), 0)
Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
Select DateAdd(Hour, DateDiff(Hour, 0, GetDate()), 0)
Select DateAdd(Second, DateDiff(Second, ''20000101'', GetDate()), ''20000101'')
El último, por segundos, requiere un manejo especial. Si usa el 1 de enero de 1900, obtendrá un error.
La diferencia de dos columnas de fecha y hora provocó el desbordamiento en el tiempo de ejecución.
Puede evitar este error utilizando una fecha de referencia diferente (como el 1 de enero de 2000).
select cast(floor(cast(@datetime as float)) as datetime)
Funciona porque emitir un horario de tiempo para flotar da la cantidad de días (incluidas las fracciones de un día) desde el 1 de enero de 1900. El suelo elimina los días fraccionarios y deja el número de días completos, que luego puede ser devuelto a una fecha y hora.
select cast(getdate()as varchar(11))as datetime