Tronca Datetime al secondo (Remove Milliseconds) in T-SQL

Qual è il modo migliore per abbreviare un datetime che include millisecondi per avere solo il secondo?

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

Questo troncerà 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 e CONVERT
DATEADD
DATEPART

Il più veloce, anche sicuro per la lingua e deterministico

 DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101') 
 convert(datetime, convert(varchar, @datetime_var, 120), 120) 

quindi, il modo più semplice ora è:

selezionare convertire (datetime2 (0), getdate ())

Quanto segue ha prestazioni molto veloci, ma non solo rimuove il millisecondo ma anche i giri al minuto. Vedere (http://msdn.microsoft.com/en-us/library/bb677243.aspx)

 select cast(yourdate as smalldatetime) from yourtable 

Modificare:

Il seguente script è fatto per confrontare gli script di Mikael e li ho upvoted entrambi, poiché entrambe le risposte sono grandiose. Il test mostrerà che lo script di gbn ‘è leggermente più veloce di 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 corsa

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

Seconda manche

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

Terza manche

 mikael gbn ----------- ----------- 5346 4620