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'