Лучший подход для удаления части времени datetime в SQL Server - PullRequest
499 голосов
/ 24 июля 2009

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

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

или

b) select cast(convert(char(11), getdate(), 113) as datetime)

Второй метод отправляет еще несколько байтовв любом случае, но это может быть не так важно, как скорость преобразования.

Оба также выглядят очень быстрыми, но может быть разница в скорости при работе с сотнями тысяч или более строк?

Кроме того, возможно ли, что есть еще лучшие способы избавиться от части времени datetime в SQL?

Ответы [ 23 ]

2 голосов
/ 09 июля 2010

Уже ответил, но плохо выкину это тоже там ... это также хорошо преформируется, но работает, отбрасывая десятичную (которая хранит время) из числа с плавающей точкой и возвращая только целую часть (которая является датой)

 CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)

во второй раз я нашел это решение ... я взял этот код с

2 голосов
/ 24 июля 2009

См. Этот вопрос:
Как обрезать дату и время в SQL Server?

Что бы вы ни делали, не использует строковый метод . Это худший способ сделать это.

2 голосов
/ 21 декабря 2012

Для меня код ниже всегда победитель:

SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT,GETDATE())));
2 голосов
/ 24 июля 2009

Разрежьте время на вставках / обновлениях в первую очередь. Что касается преобразования «на лету», ничто не может превзойти определяемую пользователем функцию maintanability:

select date_only(dd)

Реализация date_only может быть чем угодно - теперь она абстрагируется, и вызывающий коднамного намного чище.

2 голосов
/ 10 февраля 2014

выберите CONVERT (char (10), GetDate (), 126)

1 голос
/ 23 июня 2015

Здесь я сделал функцию для удаления некоторых частей datetime для SQL Server. Использование:

  • Первый параметр - это дата и время, которое нужно удалить.
  • Второй параметр - это символ:
    • s: округляет до секунд;удаляет миллисекунды
    • м: округление до минут;удаляет секунды и миллисекунды
    • h: округляет до часов;удаляет минуты, секунды и миллисекунды.
    • d: округляет до дней;удаляет часы, минуты, секунды и миллисекунды.
  • Возвращает новую дату и время

create function dbo.uf_RoundDateTime(@dt as datetime, @part as char) returns datetime as begin if CHARINDEX( @part, 'smhd',0) = 0 return @dt; return cast( Case @part when 's' then convert(varchar(19), @dt, 126) when 'm' then convert(varchar(17), @dt, 126) + '00' when 'h' then convert(varchar(14), @dt, 126) + '00:00' when 'd' then convert(varchar(14), @dt, 112) end as datetime ) end

1 голос
/ 24 сентября 2014

На всякий случай, если кто-то ищет здесь версию Sybase, так как некоторые из вышеперечисленных версий не работали

CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)
  • Протестировано в I SQL v11, работающем на Adaptive Server 15.7
1 голос
/ 24 марта 2014

Как насчет select cast(cast my_datetime_field as date) as datetime)? В результате получается та же дата со временем, установленным на 00:00, но при этом исключается любое преобразование в текст, а также исключается любое явное округление чисел.

1 голос
/ 06 февраля 2012

Я думаю, что вы имеете в виду cast(floor(cast(getdate()as float))as datetime)

real только 32-битный, и может потерять некоторую информацию

Это самый быстрый cast(cast(getdate()+x-0.5 as int)as datetime)

... хотятолько примерно на 10% быстрее (about 0.49 microseconds CPU vs. 0.58)

Это было рекомендовано и сейчас в моем тесте занимает то же время: DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

В SQL 2008 функция SQL CLR примерно в 5 разбыло бы быстрее, чем использование функции SQL, при 1,35 микросекундах по сравнению с 6,5 микросекундами, что указывает на гораздо меньшую нагрузку при вызове функции для функции SQL CLR по сравнению с простой UDF SQL.

В SQL 2005 функция SQL CLR равна 16в моем тестировании, в разы быстрее, чем эта медленная функция:

create function dateonly (  @dt datetime )
returns datetime
as
begin
return cast(floor(cast(@dt as float))as int)
end
1 голос
/ 30 августа 2013

Я думаю, что если строго придерживаться TSQL, то это самый быстрый способ усечь время:

 select convert(datetime,convert(int,convert(float,[Modified])))

Я обнаружил, что этот метод усечения примерно на 5% быстрее, чем DateAddметод. И это можно легко изменить, чтобы округлить до ближайшего дня, как это:

select convert(datetime,ROUND(convert(float,[Modified]),0))
...