Пишет st,
Сюда складываю полезные функции, "шпаргалки" и другие тонкие моменты при работе с датами на MS SQL Server.
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
Комментарии
Обнулить
Пишет Mux-Mih (не проверено),
Обнулить (очистить) время у даты:
Не знаю чем хуже такой код?
Это хак
Пишет st,
Хуже-лучше безотносительно ситуации - понятия малоинформативные.
Код с преобразованием в integer - это хак, завязанный на внутреннее представление дат в MS SQL 2005. Соответственно, при переходе на следующую версию (а в 2008 наконец-то появился типа DATE - дата без времени) код надо будет проверять на работоспособность. Зато он короче и, видимо, чуть быстрее.
Приведенный код с преобразованием varchar документирован, универсален и будет работать везде в т.ч. даже на самых старых версиях MS SQL (с учетом того, что функции появились в 2000).
В вашем варианте при @date
Пишет Anonymous (не проверено),
В вашем варианте при
@date_with_time = '2008-02-04 22:31:01'
получим новый день :2008-02-05 00:00:00.000
работа с датами - обнуление времени через datediff
Пишет alex (не проверено),
основная проблема - программисты забывают учитывать временную составляющую даты при сравнении дат. задача решается обнулнеим времени или приведением его к 23:59:59:557 (MSsql)
зачем так сложно?
мне из-за скорости пришлось выбрать вариант
DATEADD(d, DATEDIFF(d, 0, @Date), 0)
вместо
CONVERT(CHAR(8),@Date,112)
Тоже хак
Пишет st,
Тоже хак, только еще более завязанный на представление дат. См. комментарии ниже.