2012-01-26 10 views
34

Qual è il modo migliore per abbreviare un datetime che include millisecondi per avere solo il secondo?Truncate Datetime al secondo (Remove Milliseconds) in T-SQL

Ad esempio 2012-01-25 17:24:05.784 a 2012-01-25 17:24:05

+0

Nota a margine: nel mio caso sono stato davvero interessante nel confrontare le date, ma ignorando le piccole differenze (al fine di trovare record di corrispondenza sfocati). Era più sensato trovare dove 'DATEDIFF (SECONDS ...)' era inferiore a 1. – bambams

risposta

47

Ciò troncare i millisecondi.

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

Il seguente ha prestazioni molto veloce, ma non solo rimuove millisecondo, ma anche giri per minuto. Vedere (http://msdn.microsoft.com/en-us/library/bb677243.aspx)

select cast(yourdate as smalldatetime) from yourtable 

Edit:

Lo script che segue è fatto per confrontare gli script da Mikael e gbn I upvoted entrambi, poiché entrambe le risposte sono grandiose. Il test mostra che lo script gbn' è leggermente più veloce rispetto 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 

Prima esecuzione

mikael  gbn 
----------- ----------- 
5320  4686 

Seconda manche

mikael  gbn 
----------- ----------- 
5286  4883 

terza prova

mikael  gbn 
----------- ----------- 
5346  4620 
+1

'smalldatetime' tronca al minuto. (Non sono sicuro che lo dica abbastanza bene, forse dovrei dire che va al minuto). Vedere l'esempio in (http://msdn.microsoft.com/en-us/library/bb677243.aspx). Non voglio minimizzarti perché è quello che ho provato, quindi a prima vista * sembra * la risposta giusta - quindi forse utile lasciare questo. –

+0

Hai ragione, mio ​​male. smalldatetime mostra i secondi ma è sempre 0 –

+0

Ehh .. '@ mikael' il cronometraggio viene eseguito su * entrambi * i cicli. –

22

Il più veloce, anche il linguaggio sicuro e deterministica

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

Una buona opzione, ma poi devo convertirlo di nuovo (non so cosa per chiamare il tuo esempio dal momento che non è il 1970 - tempo unix) per avere un timestamp leggibile dall'uomo. –

+1

Ho usato 2000 per evitare l'overflow dei numeri interi. Puoi usare 19700101 se vuoi – gbn

+0

Utilizzato questo in passato quando voglio raggruppare da certa MS, ad esempio ogni 40 MS - vorrei davvero che fosse a volte int big. –

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

Leggermente più conciso è: CAST (CONVERT (VARCHAR, @date, 120) AS DATETIME) –

3

così, il modo più semplice ora è:

select convert (datetime2 (0), GETDATE())