Согласно cdonner , в его ответе здесь и в его блоге .
Он утверждает, что МЕЖДУ с датой дает противоречивые результаты
Из своего блога:
select
case when '9/1/08' between '9/1/08' and '9/15/08'
then 'in' else 'out' end as s1,
case when '9/1/08' between '8/28/08' and '9/1/08'
then 'in' else 'out' end as s2
s1 s2
---- ----
in in
(1 row(s) affected)
select
case when '1/1/08' between '1/1/08' and '2/1/08'
then 'in' else 'out' end as s1,
case when '1/1/08' between '12/31/07' and '1/1/08'
then 'in' else 'out' end as s2
s1 s2
---- ----
in out
(1 row(s) affected
Обратите внимание, что ответ S2 во втором запросе показывает "Out", когда ясно должна быть указана дата.
Согласно cdonner , причина этого в том, что:
[наименее значимая цифра типа DateTime в SQL составляет 3 мсек
Я думаю, что причина намного проще, чем это. Я думаю, это потому, что он использует строки, а не даты в своем запросе.
Пожалуйста, извините за мой SQLServer-иш. Я говорю в основном о Oracle, так что это может быть некрасиво. Но когда я беру его запрос, который доказывает, что есть проблема, и заменяю его строки переменными даты и времени, я получаю правильный вывод.
DECLARE @Jan108 datetime
DECLARE @Feb108 datetime
DECLARE @Dec3107 datetime
SET @Jan108 = '1/1/08'
SET @Feb108 = '2/1/08'
SET @Dec3107 = '12/31/07'
select
case when @Jan108 between @Jan108 and @Feb108
then 'in' else 'out' end as s1,
case when @Jan108 between @Dec3107 and @Jan108
then 'in' else 'out' end as s2
Что правильно?
NB: это не попытка урегулировать спор или начать пламенную войну. Я действительно хочу понять, является ли SQL Server BETWEEN менее функциональным, чем Oracle BETWEEN. У нас нет такой проблемы в Oracle.