2014-02-07 7 views
0

Я пытаюсь запросить данные для нескольких диапазонов дат. Это то, что я писал:Запрос MSSQL несколько диапазонов дат

Select Datetime, Round(value,3) As v 
From myTable 
Where charfield = 'WHATEVER' 
And ((Datetime between '2014-02-01 00:00' AND '2014-02-01 23:59') 
    OR (Datetime between '2014-02-02 00:00' AND '2014-02-02 23:59') 
    OR (Datetime between '2014-02-03 00:00' AND '2014-02-03 23:59') 
    OR (Datetime between '2014-02-04 00:00' AND '2014-02-04 23:59')) 

Но я только получить данные из последнего диапазона ('2014-02-04'), я не знаю, почему. Я уверен, что есть данные и в других интервалах.

Пожалуйста, игнорируйте тот факт, что интервалы последовательны, это всего лишь пример. В реальном коде интервалы интервалов полностью произвольны.

+3

Как примечание, если вам интересно время, обычно разумнее использовать полуоткрытый интервал (включительно начальную точку, конечную точку) и предать использование 'BETWEEN' - то есть' DateTime> = '20140201' и DateTime <'20140202'' будет вашим первым диапазоном. –

+0

[Кажется, все в порядке для меня] (http://sqlfiddle.com/#!3/16ac0/1) - Вы уверены, что есть данные? Есть ли еще вопрос, который вы пропустили для упрощения? – GarethD

+0

Вы передаете эти даты как строку или переменные типа datetime? Вы можете получить некоторые ошибки при неявном кастинге из varchar. – jean

ответ

0

При использовании BETWEEN и столбец содержит обе дату и время элементов, что вы используете в качестве конечного значения? Как вы могли бы понять, для разных типов существуют разные прецизионности. Более того, предположим, что , что тип DATETIME, и вы используете следующий предикат.

WHERE 
orderdate BETWEEN '20070201' AND '20070228 23:59:59.999' 

точность этого типа составляет три и третью миллисекунды. Миллисекундная часть конечная точка 999 не является умножением единицы точности, поэтому SQL Server заканчивает округление значения до полуночи 1 марта 2007 года. Как результат , вы можете получить некоторые заказы, re не предполагается , чтобы видеть. Короче говоря, вместо BETWEEN используйте> = и <, и эта форма будет работать правильно во всех случаях, со всеми типами даты и времени, независимо от того, применима ли временная часть или нет. Запрос Microsoft SQL Server 2012 tranining kit 70-461

Смежные вопросы