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
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
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)
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
'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. –
Hai ragione, mio male. smalldatetime mostra i secondi ma è sempre 0 –
Ehh .. '@ mikael' il cronometraggio viene eseguito su * entrambi * i cicli. –
Il più veloce, anche il linguaggio sicuro e deterministica
DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101')
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. –
Ho usato 2000 per evitare l'overflow dei numeri interi. Puoi usare 19700101 se vuoi – gbn
Utilizzato questo in passato quando voglio raggruppare da certa MS, ad esempio ogni 40 MS - vorrei davvero che fosse a volte int big. –
convert(datetime, convert(varchar, @datetime_var, 120), 120)
Leggermente più conciso è: CAST (CONVERT (VARCHAR, @date, 120) AS DATETIME) –
così, il modo più semplice ora è:
select convert (datetime2 (0), GETDATE())
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