Odpowiedzi:
powinieneś umieścić te dwie daty między pojedynczymi cudzysłowami, takimi jak ...
select Date, TotalAllowance from Calculation where EmployeeId = 1
and Date between '2011/02/25' and '2011/02/27'
lub może użyć
select Date, TotalAllowance from Calculation where EmployeeId = 1
and Date >= '2011/02/25' and Date <= '2011/02/27'
pamiętaj, że pierwsza data jest wliczona, ale druga jest wyłączna, ponieważ w rzeczywistości jest to „2011/02/27 00:00:00”
between
powinien działać zgodnie z oczekiwaniami.
Ponieważ data i godzina bez określonego odcinka czasu będzie miała wartość date 00:00:00.000
, jeśli chcesz mieć pewność, że otrzymujesz wszystkie daty w swoim zakresie, musisz albo podać datę końcową, albo zwiększyć datę końcową i użyć <
.
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date between '2011/02/25' and '2011/02/27 23:59:59.999'
LUB
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date < '2011/02/28'
LUB
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'
NIE używaj następujących danych, ponieważ mogą zwrócić niektóre rekordy z 2011/02/28, jeśli ich czasy to 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'
(przynajmniej z najnowszym MS SQL Server). convert()
Część zajmie stripping część czasu i pomiędzy porównaniu wtedy działać zgodnie z oczekiwaniami.
Spróbuj tego:
select Date,TotalAllowance from Calculation where EmployeeId=1
and [Date] between '2011/02/25' and '2011/02/27'
Wartości daty należy wpisać jako ciągi.
Aby upewnić się, że Twoje zapytanie na SQL Server 2008 i nowsze jest zabezpieczone na przyszłość, Date
należy je zmienić, ponieważ jest to słowo zastrzeżone w późniejszych wersjach.
Pamiętaj, że daty bez czasu przyjmują domyślnie północ, więc możesz nie mieć tam prawidłowej wartości.
select * from table_name where col_Date between '2011/02/25'
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))
Tutaj najpierw dodaj dzień do bieżącej daty końcowej 2011-02-28 00:00:00
, a następnie odejmij jedną sekundę, aby ustawić datę końcową 2011-02-27 23:59:59
. W ten sposób możesz uzyskać wszystkie daty między podanymi interwałami.
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'
- jeśli typ danych jest inny
To zapytanie jest przydatne do pobierania wartości między bieżącą datą a następnymi 3 datami
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
To ostatecznie doda dodatkowe 3 dni bufora do bieżącej daty.
To jest bardzo stare, ale biorąc pod uwagę wiele doświadczeń, które miałem z datami, możesz rozważyć to: Ludzie używają różnych ustawień regionalnych, jako takie, niektóre osoby (i niektóre bazy danych / komputery, w zależności od ustawień regionalnych) mogą to przeczytać data 11.12.2016 jako 11 grudnia 2016 r. lub 12 listopada 2016 r. Co więcej, 16.11.12 dostarczony do bazy danych MySQL zostanie wewnętrznie przekonwertowany na 12 listopada 2016 r., natomiast baza danych Access działająca na komputerze regionalnym w Wielkiej Brytanii zinterpretuje i zapisz jako 16 listopada 2012.
Dlatego postanowiłem, że moje zasady będą jawne za każdym razem, gdy będę wchodzić w interakcje z datami i bazami danych. Dlatego zawsze dostarczam moje zapytania i kody programowania w następujący sposób:
SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';
Pamiętaj również, że Access zaakceptuje #, a zatem:
SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;
ale serwer MS SQL nie będzie, więc zawsze używam „” jak wyżej, co akceptują obie bazy danych.
A kiedy otrzymuję tę datę ze zmiennej w kodzie, zawsze przekształcam wynik na ciąg znaków w następujący sposób:
"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")
Piszę to, ponieważ wiem, że niektórzy programiści mogą nie być wystarczająco chętni, aby wykryć nieodłączną konwersję. Nie będzie błędu dla dat <13, tylko inne wyniki!
Jeśli chodzi o zadane pytanie, dodaj jeden dzień do ostatniej daty i wykonaj porównanie w następujący sposób:
dated >= '11 Nov 2016' AND dated < '15 Nov 2016'
Spróbuj umieścić daty między # # na przykład:
#2013/4/4# and #2013/4/20#
To zadziałało dla mnie.
jeśli jego data przypada za 24 godziny i zaczyna się rano, a kończy w nocy, należy dodać coś takiego:
declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'
najlepsze zapytanie dla wybranej daty między bieżącą datą a poprzednimi trzema dniami :
select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN
DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND CURDATE()
najlepsze zapytanie dla wybranej daty między bieżącą datą a następnymi trzema dniami :
select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN
CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
Sprawdź poniżej Przykłady: zarówno pracujące, jak i niedziałające.
select * from tblUser Where
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**
LUB
select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**
LUB
select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30'))
//--**Working**
ORAZ poniżej nie działa:
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**
możemy użyć między, aby wyświetlić dane z dwóch dat, ale przeszuka to całe dane i porówna, dzięki czemu nasz proces będzie spowolniony w przypadku dużych danych, więc sugeruję wszystkim, aby używali datediff
:
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
tutaj kalendarz to Tabela, dt jako zmienna daty początkowej, a dt2 to zmienna daty końcowej.
Wybrałbym
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')
Logika >=
obejmuje całą datę początkową i <
wyklucza datę końcową, dlatego dodajemy jedną jednostkę do daty końcowej. Można to dostosować na miesiące, na przykład:
select Date, ... from ...
where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)
Select
*
from
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
Naprawdę wszystkie daty sql powinny być w formacie rrrr-MM-dd, aby uzyskać jak najdokładniejsze wyniki.
/****** 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
lepiej napisz w ten sposób:
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');