SQL-запрос для выбора даты между двумя датами - PullRequest
252 голосов
/ 26 февраля 2011

У меня есть start_date и end_date.Я хочу получить список дат между этими двумя датами.Может ли кто-нибудь помочь мне указать ошибку в моем запросе.

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and Date between 2011/02/25 and 2011/02/27

Здесь Date - это datetime переменная.

Ответы [ 20 ]

419 голосов
/ 26 февраля 2011

Вы должны поместить эти две даты в одинарные кавычки, например ..

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date between '2011/02/25' and '2011/02/27'

или можете использовать

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date >= '2011/02/25' and Date <= '2011/02/27'
109 голосов
/ 28 февраля 2014

Поскольку дата / время без указанного временного сегмента будет иметь значение date 00:00:00.000, если вы хотите быть уверенным, что вы получаете все даты в своем диапазоне, вы должны либо указать время для даты окончания, либо увеличить дату окончания. и использовать <.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/27 23:59:59.999'

OR

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date < '2011/02/28'

ИЛИ

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'

НЕ ИСПОЛЬЗУЙТЕ следующее, так как он может вернуть некоторые записи с 2011/02/28, если их время равно 00: 00: 00.000.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/28'
13 голосов
/ 26 февраля 2011

Попробуйте:

select Date,TotalAllowance from Calculation where EmployeeId=1
             and [Date] between '2011/02/25' and '2011/02/27'

Значения даты должны быть введены в виде строк.

Чтобы обеспечить защиту вашего будущего запроса для SQL Server 2008 и выше, Date должнов последних версиях это слово зарезервировано.

Имейте в виду, что по умолчанию для дат без времени принимается полночь, поэтому у вас там может быть неправильное значение.

10 голосов
/ 15 августа 2013
select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

Здесь сначала добавьте день к текущей конечной дате, это будет 2011-02-28 00:00:00, затем вычтите одну секунду, чтобы сделать дату окончания 2011-02-27 23:59:59.Делая это, вы можете получить все даты между заданными интервалами.

output:
2011/02/25
2011/02/26
2011/02/27
5 голосов
/ 05 апреля 2013
select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

- если тип данных отличается

5 голосов
/ 22 марта 2013

Этот запрос подходит для извлечения значений между текущей датой и ее следующими 3 датами

SELECT * FROM tableName  WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)

Это в конечном итоге добавит дополнительные 3 дня буфера к текущей дате.

4 голосов
/ 22 ноября 2016

Это очень старый, но учитывая большой опыт, который я имел с датами, вы можете подумать об этом: люди используют разные региональные настройки, как таковые, некоторые люди (и некоторые базы данных / компьютеры, в зависимости от региональных настроек)может читать эту дату 11/12/2016 как 11 декабря 2016 года или 12 ноября 2016 года. Более того, 16/11/12, предоставленные для базы данных MySQL, будут внутренне преобразованы в 12 ноября 2016 года, в то время как база данных Access будет работать на компьютере с региональными настройками в Великобритании.будет интерпретировать и хранить его как 16 ноября 2012 года.

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

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';

Обратите также внимание, что Access будет принимать #, таким образом:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;

, но сервер MS SQL не будет, поэтому явсегда используйте «», как указано выше, что принимают обе базы данных.

И при получении этой даты из переменной в коде я всегда преобразовываю результат в строку следующим образом:

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")

IЯ пишу это, потому что я знаю, что иногда некоторые программисты могут быть недостаточно заинтересованы, чтобы обнаружить внутреннее преобразование.Для дат <13 ошибок не будет, только другие результаты! </p>

Что касается заданного вопроса, добавьте один день к последней дате и сделайте сравнение следующим образом:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
3 голосов
/ 12 октября 2014
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
2 голосов
/ 13 ноября 2013

Попробуйте поставить даты между # # например:

#2013/4/4# and #2013/4/20#

Это сработало для меня.

1 голос
/ 25 марта 2014

, если его дата в 24 часа и начало утром и конец ночи должны добавить что-то вроде:

declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...