#sql-server-2005
#sql-server-2005
Вопрос:
У меня есть столбец datetime в таблице, который содержит компонент time.
Могу ли я в любом случае установить ‘2011-03-14 11: 46: 31’ на ‘2011-03-14 00:00:00’?
Ответ №1:
declare @date as datetime
set @date = getdate()
Select Cast(Floor(Cast(@date as float)) as DateTime)
Ответ №2:
До 2k8 я всегда;
DATEADD(DAY, DATEDIFF(DAY, 0, datecol), 0)
Комментарии:
1. упс, похоже, я пропустил этот ответ, когда публиковал свой. Вы говорите «До 2k8», но в сравнении производительности, на которое я ссылался (ниже), приведение даты оказалось самым медленным из доступных вариантов (по времени процессора); вы делаете что-то другое или это просто недостаточно важно?
2. Лично я думаю, что в большинстве случаев разница в производительности подобных преобразований на самом деле не имеет значения, в 2k8 вы можете просто
cast(getdate() as date)
Ответ №3:
Поскольку все предыдущие ответы одинаковы, я добавлю другой «хороший» вариант, о котором я знаю:
SELECT DateAdd(Day, 0, DateDiff(Day, 0, GetDate()))
Это предпочитают некоторые / многие люди, потому что это не зависит от недокументированного / неподдерживаемого факта, что дни представлены целыми числами в DateTime / SmallDateTime.
На эту тему были интересные обсуждения в SqlServerCentral.com форумы, но я не смог быстро найти ссылку, извините.
ОБНОВЛЕНИЕ: Гейл Шоу опубликовала отличное быстрое сравнение производительности распространенных методов (этот, по-видимому, самый быстрый, но лишь на очень небольшую величину): http://sqlinthewild.co.za/index.php/2008/09/04/comparing-date-truncations /
Ответ №4:
Альтернатива, которая делает то же самое, в зависимости от того, где вы ее используете. Это также можно было бы использовать в представлении и т.д., Где полный сценарий невозможен.
SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, GETDATE())))
Комментарии:
1. Я изменил предыдущий, чтобы сделать его похожим на ваш. Спасибо.