Дата и время в SQL Server 2005

#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. Я изменил предыдущий, чтобы сделать его похожим на ваш. Спасибо.