Как получить текущую дату без временной части


Ответы:


119

Самый быстрый, если вам нужно перебирать набор записей и не иметь даты в SQL Server 2008

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)

Это подтверждают два отличных ответа на StackOverflow: один , два

Преобразование Varchar - один из худших способов сделать это. Конечно, для одного значения это может не иметь значения, но это хорошая привычка.

Этот способ также является детерминированным, например, если вы хотите проиндексировать вычисляемый столбец. Даже люди, которые пишут книги о SQL Server, попадают в ловушку с преобразованием даты и времени

Эта техника также расширяема.

  • вчерашний день: DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1)
  • начало месяца: DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
  • конец прошлого месяца: DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)
  • начало следующего месяца: DATEADD(month, DATEDIFF(month, 0, GETDATE()), 31)

Редактировать:

Как я уже говорил о детерминизме, методы varchar небезопасны, если вы не используете стиль 112.

Другие ответы здесь указывают на то, что вы никогда не примените это к столбцу. Это правильно, но вы можете выбрать 100 тыс. Строк или добавить вычисляемый столбец или GROUP BY только для даты. Тогда вы должны использовать этот метод.

В другом ответе также упоминается стиль 110. Он не является безопасным для языка или SET DATEFORMAT и не работает с настройкой «британского» языка. Смотрите окончательный путеводитель по типам данных datetime от Tibor Karaszi.


1
Приведенная ссылка не работает.
Вишванатан Айер

6

Вы должны преобразовать его в varchar, указав шаблон формата (в данном случае 110), а затем преобразовать (или привести) обратно в datetime.

select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.