Работа с датами. SQL Server 2005
Сюда складываю полезные функции и тонкие моменты при работе с датами на 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