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
переменной.
19 ответов
вы должны поместить эти две даты между одинарными кавычками, как..
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'
поскольку 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'
попробуйте это:
select Date,TotalAllowance from Calculation where EmployeeId=1
and [Date] between '2011/02/25' and '2011/02/27'
значения даты должны быть введены в виде строк.
чтобы обеспечить будущую проверку вашего запроса для SQL Server 2008 и выше, Date
должны быть экранированы, потому что это зарезервированное слово в более поздних версиях.
имейте в виду, что даты без времени принимают полночь по умолчанию, поэтому у вас может не быть правильного значения.
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
этот запрос хорош для извлечения значений между текущей датой и ее следующими 3 датами
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
это в конечном итоге добавит дополнительные 3 дня буфера к текущей дате.
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
-- Если тип данных-разные
Это очень старый, но учитывая много опыта, который у меня был с датами, вы можете рассмотреть следующее: Люди используют разные региональные настройки, как таковые, некоторые люди (и некоторые базы данных/компьютеры, в зависимости от региональных настроек) могут прочитать эту дату 11/12/2016 как 11 декабря 2016 или 12 ноября 2016. Более того, 16/11/12, поставляемый в базу данных MySQL, будет внутренне преобразован в 12 Nov 2016, в то время как база данных Access, работающая на компьютере региональной настройки Великобритании, будет интерпретировать и хранить ее как 16th Nov 2012.
поэтому я сделал свою политику явной, когда я собираюсь взаимодействовать с датами и базами данных. Поэтому я всегда предоставляю свои запросы и коды программирования следующим образом:
SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';
Отметим также, что доступ будет принимать #, таким образом:
SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;
но MS SQL server не будет, поэтому я всегда использую " '", как указано выше, что обе базы данных принимают.
и при получении этой даты из переменной в коде я всегда преобразую результат в строку как следует:
"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")
Я пишу это, потому что я знаю, что иногда некоторые программисты могут быть недостаточно увлечены, чтобы обнаружить внутреннее преобразование. Не будет ошибки для dates
что касается заданного вопроса, добавьте один день к последней дате и сделайте сравнение следующим образом:
dated >= '11 Nov 2016' AND dated < '15 Nov 2016'
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
Попробуйте поместить даты между # # например:
#2013/4/4# and #2013/4/20#
это сработало для меня.
--- редактировать --- Я получил уведомление о том, что потерял два очка репутации, потому что кто-то проголосовал за этот ответ. Пожалуйста, не просто голосуйте, если ответ не работает для вас. Попросите дополнительную информацию / помощь в комментариях или проверьте другие решения.
меня не волнуют репутационные очки - я просто говорю, что голоса вниз не сделаны для этого.
лучший запрос для выбора даты между текущей датой и три дня:
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)
если его дата в 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'
Проверьте ниже примеры: как рабочие, так и нерабочие.
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**
мы можем использовать Между, чтобы показать две даты данных, но это будет искать все данные и сравнить, так что это сделает наш процесс медленным для огромных данных, поэтому я предлагаю всем использовать datediff
:
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
здесь календарь-это таблица, dt-переменная даты начала, а dt2-переменная даты окончания.
Мне нравится использовать синтаксис '1 MonthName 2015' для дат ex:
WHERE aa.AuditDate>='1 September 2015'
AND aa.AuditDate<='30 September 2015'
дат
Я бы пошел на
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)
вы можете попробовать этот SQL
select * from employee where rec_date between '2017-09-01' and '2017-09-11'
лучше написать так:
CREATE PROCEDURE dbo.Get_Data_By_Dates
(
@EmployeeId INT = 1,
@Start_Date DATE,
@End_Date Date
)
AS
Select * FROM Calculation
where EmployeeId=@EmployeeId AND Test_Date BETWEEN @Start_Date AND @End_Date
RETURN
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');