SQL Server: выборка записей между двумя датами?

В SQL я пишу SELECT, выражение для извлечения данных между двумя датами, используя between and

Пример:

select * 
from xxx 
where dates between '2012-10-26' and '2012-10-27'

Но возвращаемые строки - только 26, а не 26 и 27.

Вы можете мне помочь? Спасибо.

Ответ 1

Как ответили другие, у вас, вероятно, есть столбец DATETIME (или другой вариант), а не тип данных DATE.

Здесь условие, которое работает для всех, включая DATE:

SELECT * 
FROM xxx 
WHERE dates >= '20121026' 
  AND dates <  '20121028'    --- one day after 
                             --- it is converted to '2012-10-28 00:00:00.000'
 ;

@Aaron Bertrand сообщил об этом в блоге: Что у BETWEEN и у дьявола есть общее?

Ответ 2

Вам нужно быть более явным и добавлять время начала и окончания, вплоть до миллисекунды:

select * 
from xxx 
where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997'

База данных может очень хорошо интерпретировать '2012-10-27' как '2012-10-27 00:00:00.000'.

Ответ 3

Ваш вопрос не спросил, как правильно использовать BETWEEN, а попросил о помощи с неожиданно усеченными результатами...

Как упоминалось/намекая в других ответах, проблема в том, что у вас есть сегменты времени в дополнение к датам.

По моему опыту, использование date diff стоит дополнительного износа на клавиатуре. Это позволяет вам точно выразить то, что вы хотите, и вы охвачены.

select * 
from xxx 
where datediff(d, '2012-10-26', dates) >=0
and  datediff(d, dates,'2012-10-27') >=0

используя датифик, если первая дата предшествует второй дате, вы получаете положительное число. Существует несколько способов написать выше, например, всегда сначала поле, затем константу. Просто переверните оператора. Это вопрос личных предпочтений.

вы можете указать, хотите ли вы быть включенными или исключать конечные точки, отбрасывая один или оба одинаковых знака.

BETWEEN будет работать в вашем случае, поскольку конечные точки предполагаются полуночи (т.е. DATE). Если ваши конечные точки также были DATETIME, использование BETWEEN может потребовать еще большего литья. На мой взгляд, DATEDIFF был поставлен в нашу жизнь, чтобы изолировать нас от этих проблем.

Ответ 4

Попробуй это:

select * 
from xxx 
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'

Ответ 5

Недвусмысленный способ написать это (т.е. увеличить вторую дату на 1 и сделать ее <)

select * 
from xxx 
where dates >= '20121026'
  and dates <  '20121028'

Если вы используете SQL Server 2008 или выше, вы можете сохранить CAST как DATE, сохраняя SARGability, например

select * 
from xxx 
where CAST(dates as DATE) between '20121026' and '20121027'

Это явно говорит SQL Server, что вас интересует только часть DATE столбца dates для сравнения с диапазоном BETWEEN.

Ответ 6

попробуйте использовать следующий запрос

select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'