webentwicklung-frage-antwort-db.com.de

Mysql-Datumsfunktion funktioniert nicht weniger als

Ich muss alle Datensätze erhalten, die gleich und kleiner als 2012-12-28 sind. Ich habe die folgende Anfrage verwendet: Booking_time ist DATETIME-Feld, und es gibt Datensätze, die weniger als 2012-12-28 sind, aber Nullzeilen zurückgibt ..__ Hat jemand eine Idee?

SELECT * FROM ctx_bookings WHERE DATE(booking_time)<=2012-12-28 ORDER BY id ASC

Tabelle abgelegt

+---------------------+
| booking_time        |
+---------------------+
| 2012-12-20 03:10:09 |
| 2012-12-25 02:10:04 |
+---------------------+

Bitte weiß jemand, warum das passiert?

12
Gihan Dilusha

wickeln Sie den Wert mit einem einfachen Anführungszeichen und es wird sicher funktionieren

SELECT * 
FROM ctx_bookings 
WHERE DATE(booking_time) <= '2012-12-28' 
ORDER BY id ASC
39
John Woo

Wie unter Datums- und Zeitangaben dokumentiert :

MySQL erkennt DATE Werte in diesen Formaten:

  • Als Zeichenfolge im Format 'YYYY-MM-DD' oder 'YY-MM-DD'. Eine "entspannte" Syntax ist zulässig: Als Trennzeichen zwischen Datumsteilen kann jedes Interpunktionszeichen verwendet werden. Beispielsweise sind '2012-12-31', '2012/12/31', '2012^12^31' und '[email protected]@31' gleichwertig.

  • Als Zeichenfolge ohne Trennzeichen im Format 'YYYYMMDD' oder 'YYMMDD', vorausgesetzt, die Zeichenfolge ist als Datum sinnvoll. Beispielsweise werden '20070523' und '070523' als '2007-05-23' interpretiert, aber '071332' ist unzulässig (es hat unsinnige Teile für Monat und Tag) und wird zu '0000-00-00'.

  • Als Zahl im YYYYMMDD- oder YYMMDD-Format, sofern die Nummer als Datum sinnvoll ist. Beispielsweise werden 19830905 und 830905 als '1983-09-05' interpretiert.

Wenn @Barmar kommentiert ist, wird Ihr wörtliche Ausdruck 2012-12-28 als arithmetischer Code (2012 - 12) - 28 ausgewertet, der 1,972 entspricht.

Je @ JW.s Antwort können Sie diesen Ausdruck zitieren, um ein gültiges Datumsliteral (des ersten Formulars oben) zu erhalten. Alternative:

  • während Sie das Literal immer noch zitieren, können Sie ein anderes Interpunktionszeichen (oder sogar kein Zeichen) als Trennzeichen zwischen Datumsteilen verwenden:

    WHERE DATE(booking_time) <= '2012_12_28'
    WHERE DATE(booking_time) <= '20121228'
    
  • sie könnten die Trennzeichen entfernen und Ihr Literal nicht in Anführungszeichen setzen:

    WHERE DATE(booking_time) <= 20121228
    

Beachten Sie auch, dass die Verwendung eines Filterkriteriums wie dieses, das eine Funktion (in diesem Fall die Funktion DATE()) für eine Spalte verwendet, einen vollständigen Tabellenscan erfordert, um diese Funktion auszuwerten. Daher kann diese Funktion nicht verwendet werden. Eine sargable-Alternative wäre, den Bereich der Spaltenwerte (d. H. Times), die Ihren Kriterien entsprechen, genauer zu filtern:

WHERE booking_time < '2012-12-28' + INTERVAL 1 DAY

Dies ist gleichwertig, da jede Zeit, die strikt vor dem folgenden Tag liegt, notwendigerweise am oder vor dem interessierenden Tag stattgefunden hat. Es ist unkompliziert, da die Spalte mit einem konstanten Ausdruck verglichen wird (das Ergebnis der +-Operation ist deterministisch). Daher kann ein Index über booking_time durchsucht werden, um alle übereinstimmenden Datensätze sofort zu finden.

10
eggyal
 SELECT * FROM ctx_bookings WHERE DATE(booking_time)<='2012-12-28' ORDER BY id ASC

versuche diesen Kumpel 

1
Nipun Jain