Работа с датами. MS SQL 2005

Сюда складываю полезные функции, "шпаргалки" и другие тонкие моменты при работе с датами на MS SQL Server.

BETWEEN - закрытый интервал, но будьте вимательны со временем в датах...

SELECT *
FROM (
   SELECT '2008-02-03' AS d1
   UNION
   SELECT '2008-02-03 23:59:59' AS d1
   UNION
   SELECT <b>'2008-02-04'</b> AS d1
   UNION
   SELECT '2008-02-04 00:00:01' AS d1
   UNION
   SELECT '2008-02-05' AS d1
   UNION
   SELECT <b>'2008-02-06'</b> AS d1
   UNION
   SELECT '2008-02-06 00:00:01' AS d1
   UNION
   SELECT '2008-02-07' AS d1
) AS T
WHERE T.d1 BETWEEN '2008-02-04' AND '2008-02-06'
 
Результат:
 
d1
-------------------
2008-02-04
2008-02-04 00:00:01
2008-02-05
2008-02-06
 
(4 row(s) affected)

Обнулить (очистить) время у даты:

CREATE FUNCTION Utils_TimeToZero(@date_with_time datetime)
RETURNS datetime
AS
BEGIN
   RETURN convert(datetime, (SELECT convert(nvarchar(4), datepart(yyyy, @date_with_time)) +
      + '-' + convert(nvarchar(2), datepart(mm, @date_with_time)) +
      + '-' + convert(nvarchar(2), datepart(dd, @date_with_time))
      + ' 00:00:00'), 121);  /* добавлять 00:00:00 не обязательно */
END

Комментарии

Обнулить

Обнулить (очистить) время у даты:

CREATE FUNCTION Utils_TimeToZero(@date_with_time datetime)
RETURNS datetime
AS
BEGIN
   RETURN convert(datetime, convert(integer, @date_with_time))
END

Не знаю чем хуже такой код?

Изображение пользователя Serguei_Tarassov.

Это хак

Хуже-лучше безотносительно ситуации - понятия малоинформативные.

Код с преобразованием в integer - это хак, завязанный на внутреннее представление дат в MS SQL 2005. Соответственно, при переходе на следующую версию (а в 2008 наконец-то появился типа DATE - дата без времени) код надо будет проверять на работоспособность. Зато он короче и, видимо, чуть быстрее.

Приведенный код с преобразованием varchar документирован, универсален и будет работать везде в т.ч. даже на самых старых версиях MS SQL (с учетом того, что функции появились в 2000).

работа с датами - обнуление времени через datediff

основная проблема - программисты забывают учитывать временную составляющую даты при сравнении дат. задача решается обнулнеим времени или приведением его к 23:59:59:557 (MSsql)
зачем так сложно?
мне из-за скорости пришлось выбрать вариант
DATEADD(d, DATEDIFF(d, 0, @Date), 0)
вместо
CONVERT(CHAR(8),@Date,112)

Изображение пользователя Serguei_Tarassov.

Тоже хак

Тоже хак, только еще более завязанный на представление дат. См. комментарии ниже.