SQL-запрос для выбора дат между двумя датами

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

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

Здесь Date является переменной datetime.

Ответ 1

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

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'

Ответ 2

Поскольку время datetime без указанного сегмента времени будет иметь значение 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'

ИЛИ

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'

Ответ 3

Попробуйте следующее:

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

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

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

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

Ответ 4

select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

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

output:
2011/02/25
2011/02/26
2011/02/27

Ответ 5

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

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

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

Ответ 6

select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

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

Ответ 7

Это очень старый, но, учитывая большой опыт работы с датами, вы можете подумать об этом: люди используют разные региональные настройки, как таковые, некоторые люди (и некоторые базы данных/компьютеры, в зависимости от региональных настроек) может прочитать эту дату 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")

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

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

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 

Ответ 8

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'

Ответ 9

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

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

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

Ответ 10

если его дата в 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'

Ответ 11

лучший запрос для даты выбора между текущей датой и назад три дня:

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN       
DATE_SUB(CURDATE(), INTERVAL 3 DAY)  AND CURDATE() 

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

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN   
   CURDATE()  AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)   

Ответ 12

Проверьте ниже Примеры: как рабочие, так и нерабочие.

select * from tblUser Where    
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**

ИЛИ

select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**

ИЛИ

select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) 
//--**Working**

И ниже не работает:

select * from tblUser Where
Convert(Varchar(10),CreatedDate,111) >=  Convert(Varchar(10),'01-01-2015',111) and  Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working**


select * from tblUser Where
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working**

Ответ 13

мы можем использовать между показателями двух дат, но это будет искать все данные и сравнивать, поэтому это замедлит процесс для огромных данных, поэтому я предлагаю всем использовать datediff:

qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "

здесь calender - это таблица, dt в качестве начальной переменной даты, а dt2 - переменная даты окончания.

Ответ 14

Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;

Ответ 15

Мне нравится использовать синтаксис "1 MonthName 2015" для дат ex:

   WHERE aa.AuditDate>='1 September 2015'
     AND aa.AuditDate<='30 September 2015'

для дат

Ответ 16

Я пошел бы за

select Date,TotalAllowance from Calculation where EmployeeId=1
             and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')

Логика состоит в том, что >= включает в себя всю дату начала и < исключает дату окончания, поэтому мы добавляем одну единицу к дате окончания. Это может быть адаптировано в течение нескольких месяцев, например:

select Date, ... from ...
             where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)

Ответ 17

Вы можете попробовать этот SQL

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 

Ответ 18

На самом деле все даты sql должны быть в формате гггг-мм-дд для наиболее точных результатов.

Ответ 19

лучше написать так:

CREATE PROCEDURE dbo.Get_Data_By_Dates
(
    @EmployeeId INT = 1,
    @Start_Date DATE,
    @End_Date Date
)
AS
Select * FROM Calculation  
    where [email protected] AND Test_Date BETWEEN @Start_Date AND @End_Date
RETURN

Ответ 20

SELECT Date, TotalAllowance  
FROM Calculation  
WHERE EmployeeId = 1 
  AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd') 
               AND to_date ('2011/02/27','yyyy-mm-dd');