Frage

Wenn ich brauche auf Geburtsdatum zu suchen, die ohne die Stunden und Minuten gespeichert ist, aber das Datum muss ich suche mit Stunden und Minuten beinhaltet, was der beste Weg ist, um alle Zeilen zurück, wo Datum nur für Tag übereinstimmt, Monat und Jahr

d.
Gespeichert als 01-JAN-50 10.22.06.000000000
Datum ausgewählt 01-JAN-50 10.22.06.010101120

Wenn ich das Datum mit den Stunden verwenden und Minuten der SQL nur zurückgeben Zeilen mit dem genauen Zeitstempel und nicht die, für nur den Tag, Monat und Jahr.

Die SQL muss auf Oracle, SQLServer, MySQL und DB2 arbeiten.

War es hilfreich?

Lösung

Oracle DATE-Typ vorgeDaten die SQL-Standard-Version (wie auch Informix), die diese extrem schwierig macht - wenn nicht unmöglich - in einem DBMS-neutral zu tun. Natürlich gibt es eine Frage von „warum die Datendarstellung umfasst Zeit gewählt wird“.

Im Standard-SQL, die offensichtliche Technik wäre der Zeitstempel auf ein DATE zu werfen. Wir haben auch keine klare Erklärung der Daten, mit denen Sie suchen müssen.

SELECT CAST(DateOfBirth AS DATE), ...other columns...
    FROM TheMysteryTable         -- Why do people hate giving tables names?
    WHERE CAST(DateOfBirth AS DATE) =
          CAST(TIMESTAMP '1950-01-01 10.22.06.010101120' AS DATE)

Aber das setzt voraus, dass Sie das ‚Datum suchen mit‘ schreiben, als einem wörtlichen. Wenn es ein Host-Variable ist, dann sollte die Art der Host-Variablen DATE, nicht Zeitstempel. Und die DateOfBirth Spalte sollte wahrscheinlich ein DATE, kein TIMESTAMP sein. Sie sollten nicht TIMESTAMP verwenden, wenn die Zeit Teil relevant ist -. Es vergeudet Lagerung und es verschwendet Rechenzeit

Beachten Sie, dass aufgrund der Abgüsse, ist es unwahrscheinlich, dass das DBMS Lage sein wird, alle Indizes oder irgendetwas zu verwenden. Wenn die Typen SANE wurden, dann würde die Abfrage einfach sein:

SELECT DateOfBirth, ...other columns...
    FROM TheMysteryTable
    WHERE DateOfBirth = DATE '1950-01-01'

Andere Tipps

Als eine Lösung erfordert Manipulation von Datum und Datetime-Objekte geht, dann wird es keine systemunabhängige Lösung sein -. Jeweils unterschiedliche Funktionen für diese Objekte haben

Die beste Lösung, andere als Datenbankabstraktion, wäre das Datetime-Objekt abzuzurunden zuerst verwendet wird, dann nur eine generische SQL-Vergleich Klausel erforderlich, die in allen aufgeführten DBs funktionsfähig sein wird.

Es gibt kein ANSI Datumsformat, noch String-Manipulation. Jeder Code wird nur in bestimmten RDBMS laufen, wenn nicht nur ein.

Allerdings, wenn Sie Ihre gewählte Datum außerhalb Ihres RDBMS bekommen (sagen wir, PHP, Java, etc.), ich würde vorschlagen, es Hygienisierung, bevor es in der Abfrage zu senden; dann können Sie String String vergleichen, die fast alle Systeme arbeiten in sollte.

Wie andere haben darauf hingewiesen, sind RDBMS sehr unterschiedlich, wenn es um die Handhabung Datetimes kommt. Wenn folgten sie tatsächlich die ANSI-92-Standard, dann sollten folgende Arbeiten:

SELECT
     <column list>
FROM
     <table name>
WHERE
     CAST(birth_date AS DATE) = CAST(search_date AS DATE)

Das wäre nicht der effizienteste Weg sein, es aber zu tun, da es für die meisten Systeme mit Indizes zum Zeitpunkt ausschließen würde. Die folgende könnte Arbeit für eine voll ANSI-92-kompatible Datenbank:

SELECT
     <column list>
FROM
     <table name>
WHERE
     birth_date >= CAST(CAST(search_date AS DATE) AS DATETIME) AND
     birth_date < CAST(CAST(search_date AS DATE) + 1 AS DATETIME)

Mit extract ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top