Відповіді:
ви повинні помістити ці дві дати між окремими цитатами, як ..
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'
майте на увазі, що перше побачення включно, але друге - ексклюзивне, оскільки воно фактично є "2011/02/27 00:00:00"
Оскільки час дати без визначеного часового відрізка матиме значення 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'
'2011/02/28 00:00:00.000'
?
convert(date, Date) between '2011/02/25' and '2011/02/27'
(принаймні, з недавнім MS SQL Server). convert()
Частина дбатиме про позбавивши частину часу і між порівняння буде працювати , як очікувалося.
Спробуйте це:
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
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
- якщо тип даних інший
Цей запит добре підходить для отримання значень між поточною датою та наступними 3 датами
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
Це з часом додасть додаткові 3 дні буфера до поточної дати.
Це дуже давно, але враховуючи багато досвіду, який я мав з датами, ви можете розглянути це: Люди використовують різні регіональні налаштування, як такі, деякі люди (і деякі бази даних / комп'ютери, залежно від регіональних налаштувань) можуть читати це дата 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'
Спробуйте вказати дати між # #, наприклад:
#2013/4/4# and #2013/4/20#
Це працювало для мене.
якщо його дата через 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 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)
Перевірте нижче Приклади: Працюючі та неробочі.
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 - змінна дата завершення.
Я б пішов на
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 повинні бути у форматі yyyy-MM-dd для отримання найбільш точних результатів.
/****** Script for SelectTopNRows command from SSMS ******/
SELECT TOP 10 [Id]
,[Id_parvandeh]
,[FirstName]
,[LastName]
,[RegDate]
,[Gilder]
,[Nationality]
,[Educ]
,[PhoneNumber]
,[DueInMashhad]
,[EzdevajDate]
,[MarriageStatus]
,[Gender]
,[Photo]
,[ModifiedOn]
,[CreatorIp]
From
[dbo].[Socials] where educ >= 3 or EzdevajDate >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1
краще написати так:
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');