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

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

Комментарии (2) -

Alle
Alle Russia
14.06.2012 23:20:17 #

Прошу помочь с таким вопросом:

and (DATE_OCCURED BETWEEN CONVERT(datetime, '14.06.2012 00:00:00', 104) AND CONVERT(datetime, '14.06.2012 23:59:59', 104))
это я задаю в селекте, что б получить информацию за прошлые сутки
Вопрос, как правильно прописать, что б брал запрос информации за прошлые сутки автоматически
разбирался с getdate, getdate()-1
но ничего не выходит
Спасибо.

Reply

Alexey Knyazev
Alexey Knyazev Russia
04.07.2012 13:29:59 #

Любым способом из этой статьи, например:

and
( DATE_OCCURED BETWEEN
dateadd( d, datediff( d, 0, getdate() ), 0 ) and dateadd( d, datediff( d, 0, getdate() ), 1 )
)

Reply

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading