Ich habe einen start_date
und end_date
. Ich möchte die Liste der Daten zwischen diesen beiden Daten abrufen. Kann mir jemand helfen, den Fehler in meiner Anfrage anzuzeigen.
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and Date between 2011/02/25 and 2011/02/27
Hier ist Date
eine Variable datetime
.
sie sollten diese beiden Daten zwischen einfachen Anführungszeichen setzen, wie ..
select Date, TotalAllowance from Calculation where EmployeeId = 1
and Date between '2011/02/25' and '2011/02/27'
oder verwenden können
select Date, TotalAllowance from Calculation where EmployeeId = 1
and Date >= '2011/02/25' and Date <= '2011/02/27'
Da eine Datumszeit ohne ein bestimmtes Zeitsegment den Wert date 00:00:00.000
hat, müssen Sie entweder die Uhrzeit für Ihr Enddatum angeben oder Ihr Enddatum erhöhen und <
verwenden, wenn Sie sicher gehen möchten, dass Sie alle Daten in Ihrem Bereich erhalten.
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'
ODER
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'
Verwenden Sie NICHT das Folgende, da es einige Datensätze vom 2011/02/28 zurückgeben könnte, wenn die Uhrzeit 00: 00: 00.000 ist.
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date between '2011/02/25' and '2011/02/28'
Versuche dies:
select Date,TotalAllowance from Calculation where EmployeeId=1
and [Date] between '2011/02/25' and '2011/02/27'
Die Datumswerte müssen als Zeichenfolgen eingegeben werden.
Um die Zukunftssicherung Ihrer Abfrage für SQL Server 2008 und höher sicherzustellen, sollte Date
mit Escapezeichen versehen werden, da es sich in späteren Versionen um ein reserviertes Word handelt.
Beachten Sie, dass die Datumsangaben ohne Uhrzeit als Standardwerte Mitternacht verwenden, sodass Sie dort möglicherweise nicht den richtigen Wert haben.
select * from table_name where col_Date between '2011/02/25'
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))
Fügen Sie hier zunächst einen Tag zum aktuellen Enddatum hinzu, es wird 2011-02-28 00:00:00
sein, und subtrahieren Sie dann eine Sekunde, um das Enddatum 2011-02-27 23:59:59
festzulegen. Auf diese Weise können Sie alle Daten zwischen den angegebenen Intervallen erhalten.
output:
2011/02/25
2011/02/26
2011/02/27
Diese Abfrage ist gut für das Abrufen der Werte zwischen dem aktuellen Datum und den nächsten 3 Daten
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
Dies fügt dem aktuellen Datum eventuell zusätzliche 3 Tage Puffer hinzu.
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
- wenn der Datentyp unterschiedlich ist
Dies ist sehr alt, aber bei vielen Erfahrungen, die ich mit Daten gemacht habe, sollten Sie Folgendes in Betracht ziehen: Menschen verwenden unterschiedliche regionale Einstellungen. Daher lesen einige Personen (und einige Datenbanken/Computer je nach regionalen Einstellungen) dies Datum 11.12.2016 als 11. Dezember 2016 oder 12. November 2016. Darüber hinaus wird der 16.11.12, der an die MySQL-Datenbank geliefert wird, intern auf den 12. November 2016 konvertiert, während die Access-Datenbank, die auf einem britischen Computer mit regionaler Umgebung ausgeführt wird, interpretiert Speichern Sie es als 16. November 2012.
Daher habe ich es mir zur Aufgabe gemacht, bei jeder Interaktion mit Datumsangaben und Datenbanken explizit zu sein. Deshalb gebe ich meine Anfragen und Programmiercodes immer wie folgt an:
SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';
Beachten Sie auch, dass Access die # akzeptiert, also:
SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;
mS SQL-Server wird dies jedoch nicht tun, daher verwende ich immer '' 'wie oben, was beide Datenbanken akzeptieren.
Und wenn ich dieses Datum aus einer Variablen im Code bekomme, konvertiere ich das Ergebnis immer wie folgt in eine Zeichenfolge:
"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")
Ich schreibe das, weil ich weiß, dass manche Programmierer manchmal nicht scharf genug sind, um die inhärente Konvertierung zu erkennen. Bei Datumsangaben <13 wird kein Fehler ausgegeben, nur abweichende Ergebnisse!
Fügen Sie für die gestellte Frage einen Tag zum letzten Datum hinzu und führen Sie den Vergleich wie folgt aus:
dated >= '11 Nov 2016' AND dated < '15 Nov 2016'
Platzieren Sie die Datumsangaben zwischen # # , Zum Beispiel:
#2013/4/4# and #2013/4/20#
Es hat für mich funktioniert.
--- EDIT --- Ich erhielt die Benachrichtigung, dass ich zwei Ansehenspunkte verloren habe, weil jemand diese Antwort abgelehnt hat. Bitte stimmen Sie nicht einfach ab, wenn die Antwort für Sie nicht funktioniert. Fragen Sie nach weiteren Informationen/Hilfe in den Kommentaren oder prüfen Sie andere Lösungen.
Ich interessiere mich nicht für Reputationspunkte - ich sage nur, dass dafür keine Abstimmungen gemacht werden.
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
beste Abfrage für das Auswahldatum zwischen aktuellem Datum und drei Tagen zurück :
select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN
DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND CURDATE()
beste Abfrage für das Auswahldatum zwischen aktuellem Datum und nächsten drei Tagen :
select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN
CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
wenn das Datum in 24 Stunden beginnt und am Morgen beginnt und in der Nacht endet, sollte Folgendes hinzugefügt werden:
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
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
wir können zwischen zwei Daten anzeigen, aber dies wird die gesamten Daten durchsuchen und vergleichen, sodass unser Prozess für riesige Daten langsam wird. Ich schlage daher vor, dass jeder datediff
verwendet:
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
hier ist Kalender die Tabelle, dt als Variable für das Startdatum und dt2 ist die Variable für das Enddatum.
Überprüfen Sie die folgenden Beispiele: Arbeit und Nichtarbeit.
select * from tblUser Where
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**
OR
select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**
OR
select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30'))
//--**Working**
UND unten funktioniert nicht:
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**
Alle SQL-Daten sollten im Format JJJJ-MM-TT vorliegen, um die genauesten Ergebnisse zu erzielen.
Sie können diese SQL ausprobieren
select * from employee where rec_date between '2017-09-01' and '2017-09-11'
Ich würde gehen
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')
Die Logik, dass >=
das gesamte Startdatum beinhaltet und <
das Enddatum ausschließt, fügen wir eine Einheit zum Enddatum hinzu. Dies kann für Monate angepasst werden, zum Beispiel:
select Date, ... from ...
where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)
Ich benutze gerne die Syntax '1 MonthName 2015' für Datumsangaben:
WHERE aa.AuditDate>='1 September 2015'
AND aa.AuditDate<='30 September 2015'
für Termine