2008-11-25 16 views
10

Benutzung von MySQL-Syntax und eine Tabelle mit einer Zeile, die wie:In SQL, wie Datumswerte zu vergleichen?

mydate DATETIME NULL, 

Gibt es eine Möglichkeit, wie etwas zu tun ist:

... WHERE mydate<='2008-11-25'; 

Ich versuche aber nicht wirklich den Weg zur Arbeit.

Antwort

8

Nevermind eine Antwort gefunden. Ty das gleiche für jeden, der bereit war zu antworten.

WHERE DATEDIFF(mydata,'2008-11-20') >=0; 
+0

Gern geschehen;) – Arvo

+3

Das sieht langsam aus: Funktionsaufruf und implizite Konvertierung für jede Zeile in der Tabelle. Es muss einen Weg geben, Daten direkter zu vergleichen. –

+0

Indizes sind auf diese Weise unbenutzt ... – FerranB

18

Uh, WHERE mydate<='2008-11-25'ist die Art und Weise, es zu tun. Das sollte funktionieren.

Erhalten Sie eine Fehlermeldung? Verwenden Sie eine alte Version von MySQL?

Edit: Die folgende funktioniert für mich auf MySQL 5.x feinen

create temporary table foo(d datetime); 
insert into foo(d) VALUES ('2000-01-01'); 
insert into foo(d) VALUES ('2001-01-01'); 
select * from foo where d <= '2000-06-01'; 
+0

Auf meinem PostgreSQL DBMS, tatsächlich, es funktioniert gut. Kann eine MySQL-Schwäche sein? – bortzmeyer

+0

Yup es funktioniert nicht in mysql – fmsf

+1

Err, es funktioniert auch auf MySQL. :) Ich habe es gerade versucht, um sicherzustellen, dass ich nicht verrückt bin. Welche Version von MySQL verwenden Sie fmfs? Erhalten Sie einen Fehler? – Eli

6

In Standard-SQL-Syntax, verwenden Sie:

WHERE mydate <= DATE '2008-11-20' 

Das heißt, sollte das Schlüsselwort DATE die Zeichenfolge vorangestellt . In einigen DBMS müssen Sie jedoch nicht so explizit sein; Das System wird die DATE-Spalte automatisch in eine Zeichenfolge oder die Zeichenfolge in einen DATE-Wert konvertieren. Es gibt nominell einige interessante Implikationen, wenn das DATUM in eine Zeichenkette umgewandelt wird - wenn Sie Daten im ersten Jahrtausend (0001-01-01 .. 0999-12-31) haben und die führenden Nullstellen durch die Formatierungssystem.

+0

Beachten Sie, dass, wenn alle Daten wie abgebildet im ISO 8601-Format vorliegen, Zeichenfolgenvergleiche funktionieren (eine Eigenschaft von ISO 8601). – bortzmeyer

+0

Wenn die führenden Nullen enthalten sind, ja.Wenn Sie Daten vor dem 01.01.01 haben, kann das DBMS theoretisch führende Nullen weglassen. Ich bin mir nicht sicher, ob das sehr wahrscheinlich ist, aber es sind noch merkwürdigere Dinge bekannt geworden. Oracle unterstützt Termine BCE (BC); diese vergleichen nicht zuverlässig als Strings. –

0

Sie könnten die Zeitkomponente

WHERE mydate<='2008-11-25 23:59:59' 

hinzufügen, aber das könnte auf DST Umschaltung Daten fehlschlagen, wenn mydate ‚2008-11-25 24:59:59‘ ist, so ist es wahrscheinlich sicherste ist alles, bevor die packen nächstes Datum:

WHERE mydate < '2008-11-26 00:00:00' 
0

Ihr Problem kann sein, dass Sie DATETIME-Daten verarbeiten, nicht nur Daten. Wenn eine Zeile ein Mydate hat, das "2008-11-25 09:30 AM" ist, dann lautet Ihr WHERE mydate < = '2008-11-25'; wird diese Zeile nicht zurückgeben. "2008-11-25" hat eine implizierte Zeit von 00:00 (Mitternacht), also obwohl der Datumsteil derselbe ist, sind sie nicht gleich und mydate ist größer. Wenn Sie < '2008-11-26' anstelle von < = '2008-11-25' verwenden, würde das funktionieren. Die Datediff-Methode funktioniert, weil sie nur den Datumsteil vergleicht und die Zeiten ignoriert.