Подтвердить что ты не робот

Усекать время от времени до второго (удалить миллисекунды) в T-SQL

Каков наилучший способ сократить время и время, включая миллисекунды, чтобы иметь только второй?

Например, 2012-01-25 17:24:05.784 - 2012-01-25 17:24:05

4b9b3361

Ответ 1

Это сократит миллисекунды.

declare @X datetime
set @X = '2012-01-25 17:24:05.784'
select convert(datetime, convert(char(19), @X, 126))

или

select dateadd(millisecond, -datepart(millisecond, @X), @X)

CAST и CONVERT
DATEADD
DATEPART

Ответ 2

Самый быстрый, также безопасный и детерминированный язык

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

Ответ 3

convert(datetime, convert(varchar, @datetime_var, 120), 120)

Ответ 4

Итак, самый простой способ:

выберите convert (datetime2 (0), getdate())

Ответ 5

Следующее имеет очень быструю производительность, но не только удаляет миллисекунду, но и округляет до минуты. См. (Http://msdn.microsoft.com/en-us/library/bb677243.aspx)

select cast(yourdate as smalldatetime) from yourtable

Edit:

Для сравнения скриптов из Mikael и gbn я выполняется следующее script, так как оба ответа велики. Тест покажет, что gbn 'script немного быстрее, чем 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 

Первый запуск

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

Второй прогон

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

Третий прогон

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

Ответ 6

Я не знаю, является ли это самым быстрым, но он правильно обрезает тип данных [datetime2] и избегает входить и выходить из строкового формата.

declare @dt datetime2= SYSDATETIME()
;
select @dt, DATEADD(SECOND, DATEDIFF(SECOND, 0, CAST(@dt AS time)), CAST(CAST(@dt AS date) AS datetime2(0)))
;

И аналогичное решение для типа данных [time]:

declare @t time = SYSDATETIME()
;
select @t, DATEADD(SECOND, DATEDIFF(SECOND, 0, @t), CAST(0x00000000 AS time(0)))
;

Оба они основаны на предпосылке, что с типизированным выражением [time] для одного из параметров date/startdate/enddate DATEDIFF и DATEADD, по-видимому, интерпретируют 0 для другого параметра date/startdate/enddate как 00:00:00 полночь а не 0001/01/01 00:00:00.

НТН

Дэн

Ответ 7

declare @dt datetime2
set @dt = '2019-09-04 17:24:05.784' 
select convert(datetime2(0), @dt)