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

| рубрика: Программирование | автор: st
Метки:

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

BETWEEN - закрытый интервал

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

SELECT *
FROM (
   SELECT '2008-02-03' AS d1
   UNION
   SELECT '2008-02-03 23:59:59' AS d1
   UNION
   SELECT '2008-02-04' AS d1
   UNION
   SELECT '2008-02-04 00:00:01' AS d1
   UNION
   SELECT '2008-02-05' AS d1
   UNION
   SELECT '2008-02-06' 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

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

SELECT @date_without_time = CAST(CAST(@date_with_time AS int) - 1 AS DATETIME);

Для версий 2008 и выше можно просто привести к типу DATE и, если требуется, обратно в дату со временем

SELECT @date_without_time = CAST(@date_with_time AS DATE);

SELECT @date_without_time = CAST(CAST(@date_with_time AS DATE) AS DATETIME);

blog comments powered by Disqus