2012-01-26 31 views
34

¿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

+0

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

Respuesta

47

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) 

CAST and CONVERT
DATEADD
DATEPART

3

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 
+1

'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. –

+0

Tienes razón, mi mal. smalldatetime muestra los segundos pero siempre es 0 –

+0

Ehh .. '@ mikael' tiempo se realiza a través de ambos lazos * *. –

22

El más rápido, también el lenguaje seguro y determinista

DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101') 
+0

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. –

+1

Utilicé 2000 para evitar el desbordamiento de enteros. Puede usar 19700101 si quiere – gbn

+0

Utilicé esto en el pasado cuando quiero agrupar por cierta MS, digamos cada 40 MS - realmente me gustaría que fuera grande a veces. –

7
convert(datetime, convert(varchar, @datetime_var, 120), 120) 
+1

Un poco más escueto es: CAST (CONVERT (VARCHAR, @date, 120) AS DATETIME) –

3

así, la manera más fácil ahora es:

select convert (datetime2 (0), getdate())

Cuestiones relacionadas