Ich habe eine Tabelle mit Daten, die alle im Monat November passiert sind. Ich habe diese Abfrage geschrieben
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= '2013-04-12'
Diese Abfrage sollte alles zurückgeben, was im Monat 11 (November) passiert ist, da es vor dem Datum '2013-04-12' (im Dezember) passiert ist.
Aber es ist die Rückkehr nur Termine, die weniger in Tagen passiert als 04 (2013- 04 -12)
Könnte es sein, dass es nur den Tagesteil vergleicht? und nicht das ganze Datum?
Wie kann ich das beheben?
Erstellungsdatum ist vom Typ Datum
Das Datumsformat ist standardmäßig JJJJ-TT-MM
sql
sql-server
date
compare
HelpASisterOut
quelle
quelle
2013-04-12
? ist der 12. April? Oder ist vielleichtcreated_date
eine Zeichenfolge und kein Datum?Antworten:
Verwenden Sie anstelle von '2013-04-12', dessen Bedeutung von der lokalen Kultur abhängt, '20130412', das als kulturinvariantes Format anerkannt ist.
Wenn Sie mit 4. Dezember vergleichen wollen th , sollten Sie ‚20131204‘ schreiben. Wenn Sie mit dem 12. April vergleichen möchten th , sollten Sie ‚20130412‘ schreiben.
Der Artikel Schreiben internationaler Transact-SQL-Anweisungen aus der SQL Server-Dokumentation erläutert, wie Anweisungen geschrieben werden, die kulturinvariant sind:
BEARBEITEN
Da Sie ADO verwenden, besteht die beste Option darin, die Abfrage zu parametrisieren und den Datumswert als Datumsparameter zu übergeben. Auf diese Weise vermeiden Sie das Formatproblem vollständig und profitieren auch von den Leistungsvorteilen parametrisierter Abfragen.
AKTUALISIEREN
Um das ISO 8601-Format in einem Literal verwenden zu können, müssen alle Elemente angegeben werden. Zitat aus dem Abschnitt ISO 8601 der datetime-Dokumentation
quelle
To use the ISO 8601 format, you must specify each element in the format. This also includes the T
.YYYY-MM-DD
es nicht als ISO 8601 anerkannt ist. Die Zeitteile sind erforderlich. Nennen wir es die Seltsamkeit von T-SQL, wenn Sie so wollen, oder die unvollständige Implementierung. Es kann sogar sein, dass dies von SybaseVersuchen Sie es so
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= '2013-12-04'
quelle
Wenn Sie nur mit dem Datumsbereich vergleichen, funktioniert die Konvertierung in Datum (nicht Datum / Uhrzeit )
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= convert(date,'2013-04-12',102)
Diese Konvertierung gilt auch für die Verwendung der Funktion GetDate ()
quelle
Sie setzen
<=
und es wird auch das angegebene Datum fangen. Sie können es<
nur durch ersetzen .quelle
Bitte versuchen Sie es mit der folgenden Abfrage
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where convert(datetime, convert(varchar(10), created_date, 102)) <= convert(datetime,'2013-04-12')
quelle
Das Datumsformat ist JJJJ-MM-TT. Die obige Abfrage sucht also nach Datensätzen, die älter als 12Apr2013 sind
Schlagen Sie vor, eine schnelle Überprüfung durchzuführen, indem Sie die Datumszeichenfolge auf '2013-04-30' setzen. Wenn kein SQL-Fehler vorliegt, wird das Datumsformat auf JJJJ-MM-TT bestätigt.
quelle
Versuchen Sie, "#" vor und nach dem Datum zu verwenden, und achten Sie auf das Datumsformat Ihres Systems. vielleicht "JJJJMMTT O JJJJ-MM-TT O MM-TT-JJJJ O VERWENDUNG '/ O \'"
Ex:
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= #2013-04-12#
quelle