Как обнулить время у даты (ru-RU)
«Как получить текущую дату, без учёта времени?»
Вариантов много, но хотелось бы их собрать все вместе:
1) Самый известный и документированный способ – это конвертация даты в строку в нужном формате и обратно в дату:
SELECT CONVERT( DATETIME, CONVERT( VARCHAR, GETDATE(), 112 ) )
SELECT DATEADD( d, DATEDIFF( d, 0, GETDATE() ), 0 )
- Третий способ – это конвертация даты в тип 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 цифр. Точность типа данных ограничена отдельным днем.