Поделиться через


Как обнулить время у даты (ru-RU)

«Как получить текущую дату, без учёта времени?»

Вариантов много, но хотелось бы их собрать все вместе:

1) Самый известный и документированный способ – это конвертация даты в строку в нужном формате и обратно в дату:

SELECT CONVERT( DATETIME, CONVERT(  VARCHAR, GETDATE(), 112 ) )
  1. Второй способ – это использование функций даты и времени ( dateadddatediff ):
SELECT DATEADD( d, DATEDIFF( d, 0, GETDATE() ), 0 )
  1. Третий способ – это конвертация даты в тип float и использование математической функции floor, которая возвращает наибольшее целое число, меньшее или равное указанному числовому выражению или математическую функцию round:
SELECT CONVERT( DATETIME, FLOOR( CONVERT(  FLOAT, GETDATE() ) ) )
 
SELECT CONVERT( DATETIME, ROUND( CONVERT(  FLOAT, GETDATE() ), 0, 1 ) )

4) Четвёртый способ отталкивается от особенностей типа datetime.

Выдержка из русскоязычного BOL:

Значения типа datetime хранятся в виде 4-байтовых целых чисел. Первые четыре байта содержат количество дней до или после даты отсчета: 1 января 1900 года. Дата отсчета является системной датой. Вторые четыре байта содержат текущее значение времени, представленного в виде трехсотых долей секунды, прошедших после полуночи.

SELECT CAST( CAST( CAST(  CAST( GETDATE()  as  BINARY(8) ) as BINARY(4) ) as  BINARY(8) ) as DATETIME )

5) Пятый способ – это синтаксис OLE DB/ODBC, который SQL Server отлично понимает:

SELECT CONVERT( DATETIME, {fn CURDATE()} )
 
SELECT CONVERT( DATETIME, {fn CURRENT_DATE()} )

6) Тип данных date, новый тип данных, который появится в MS SQL Server 2008, сохраняет дату без компонента времени. Диапазон – от 1 января 0001 года до 31 декабря 9999 года (от 0001-01-01 до 9999-12-31). Каждая переменная даты требует трех байтов для хранения и имеет точность в 10 цифр. Точность типа данных ограничена отдельным днем.