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