SQL Server: выборка записей между двумя датами?
В SQL я пишу SELECT
для извлечения данных между двумя датами, используя
Пример:
select * from xxx where dates between '2012-10-26' and '2012-10-27'
Но возвращаемые строки – только 26, а не 26 и 27.
- хотите вставить текущее время по умолчанию в столбце datetime со вставленной датой в sql server
- Сравните строку даты с datetime в SQL Server?
- Группа SQL Server по количеству дней в часах?
- Как определить последовательные записи даты на сервере sql
- Преобразование секунд в формат «00: 00: 00» - SQL Server
Вы можете мне помочь? Спасибо.
- Datetime in where where
- T-SQL CASE, КОГДА МЕЖДУ не распознающим условие
- SQL DateDifference в предложении where
- Добавление секунд с использованием DATEADD возвращает значение, округленное до минут - почему?
- Почему значение SQL Server CONVERT значения DATE в стиле даты + времени не включает время?
- Преобразование типа даты C #
- Утечка памяти при использовании времени в SQL-запросе NHibernate
- Сравнение диапазона дат с набором диапазонов дат SQL
Как ответили другие, у вас, вероятно, есть столбец 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
и у дьявола есть общее?
Вам нужно быть более явным и добавлять время начала и окончания, вплоть до миллисекунды:
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'
.
Недвусмысленный способ написать это (т.е. увеличить вторую дату на 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.
Попробуй это:
select * from xxx where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
Ваш вопрос не спросил, как правильно использовать 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 был поставлен в нашу жизнь, чтобы изолировать нас от этих проблем.
попробуйте использовать следующий запрос
select * from xxx where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'