Каков наилучший способ сократить время и время, включая миллисекунды, чтобы иметь только второй?
Например, 2012-01-25 17:24:05.784
- 2012-01-25 17:24:05
Каков наилучший способ сократить время и время, включая миллисекунды, чтобы иметь только второй?
Например, 2012-01-25 17:24:05.784
- 2012-01-25 17:24:05
Это сократит миллисекунды.
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)
Самый быстрый, также безопасный и детерминированный язык
DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101')
convert(datetime, convert(varchar, @datetime_var, 120), 120)
Итак, самый простой способ:
выберите convert (datetime2 (0), getdate())
Следующее имеет очень быструю производительность, но не только удаляет миллисекунду, но и округляет до минуты. См. (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
Я не знаю, является ли это самым быстрым, но он правильно обрезает тип данных [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.
НТН
Дэн
declare @dt datetime2
set @dt = '2019-09-04 17:24:05.784'
select convert(datetime2(0), @dt)