Обнулить время

by Alexey Knyazev 20. июля 2009 20:57

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


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


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 цифр. Точность типа данных ограничена отдельным днем.

[Ещё]

Tags: ,

SQL Server