¿Cuál es la mejor manera de acortar una fecha y hora que incluye milisegundos a sólo tienen el segundo?Truncar fecha y hora a la segunda (Eliminar milisegundos) en T-SQL
Por ejemplo 2012-01-25 17:24:05.784
-2012-01-25 17:24:05
¿Cuál es la mejor manera de acortar una fecha y hora que incluye milisegundos a sólo tienen el segundo?Truncar fecha y hora a la segunda (Eliminar milisegundos) en T-SQL
Por ejemplo 2012-01-25 17:24:05.784
-2012-01-25 17:24:05
Esto truncar los milisegundos.
declare @X datetime
set @X = '2012-01-25 17:24:05.784'
select convert(datetime, convert(char(19), @X, 126))
o
select dateadd(millisecond, -datepart(millisecond, @X), @X)
La siguiente tiene muy buen rendimiento, pero no sólo elimina la milésima de segundo, pero también se redondea a minuto. Ver (http://msdn.microsoft.com/en-us/library/bb677243.aspx)
select cast(yourdate as smalldatetime) from yourtable
Editar:
La siguiente secuencia de comandos se hizo para comparar las secuencias de comandos de Mikael y GBN que upvoted ambos, ya que ambas respuestas son geniales. El examen muestra que el guión gbn' es ligeramente más rápido que Mikaels:
declare @a datetime
declare @x int = 1
declare @mikaelend datetime
declare @mikael datetime = getdate()
while @x < 5000000
begin
select @a = dateadd(millisecond, -datepart(millisecond, getdate()), getdate()) , @x +=1
end
set @mikaelend = getdate()
set @x = 1
declare @gbnend datetime
declare @gbn datetime = getdate()
while @x < 5000000
begin
select @a = DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101') , @x +=1
end
set @gbnend = getdate()
select datediff(ms, @mikael, @mikaelend) mikael, datediff(ms, @gbn, @gbnend) gbn
Primera corrida
mikael gbn
----------- -----------
5320 4686
segunda pasada
mikael gbn
----------- -----------
5286 4883
tercera carrera
mikael gbn
----------- -----------
5346 4620
'smalldatetime' trunca al minuto. (No estoy seguro de si estoy diciendo que es correcto, tal vez debería decir que se redondea al minuto). Vea el ejemplo en (http://msdn.microsoft.com/en-us/library/bb677243.aspx). No quiero que downvote porque esto era lo que intentaba, por lo que a primera vista parece * * como la respuesta correcta - así que tal vez útil para salir de esta. –
Tienes razón, mi mal. smalldatetime muestra los segundos pero siempre es 0 –
Ehh .. '@ mikael' tiempo se realiza a través de ambos lazos * *. –
El más rápido, también el lenguaje seguro y determinista
DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101')
Una buena opción, pero luego tengo que convertirla de nuevo (no estoy seguro de qué para llamar a su ejemplo, ya que no es 1970 - tiempo Unix) para tener una marca de tiempo legible por humanos. –
Utilicé 2000 para evitar el desbordamiento de enteros. Puede usar 19700101 si quiere – gbn
Utilicé esto en el pasado cuando quiero agrupar por cierta MS, digamos cada 40 MS - realmente me gustaría que fuera grande a veces. –
convert(datetime, convert(varchar, @datetime_var, 120), 120)
Un poco más escueto es: CAST (CONVERT (VARCHAR, @date, 120) AS DATETIME) –
así, la manera más fácil ahora es:
select convert (datetime2 (0), getdate())
Nota al margen: en mi caso, fui realmente interesante al comparar fechas, pero ignorando pequeñas diferencias (para encontrar registros de coincidencia difusa). Se hizo un mejor sentido para encontrar donde 'DATEDIFF (segundos ...)' fue inferior a 1. – bambams