2016-05-12 8 views
-2

Ich habe eine Tabelle, in der Datumsspalte Daten in folgendem Format hat: "7/25/2014 12:14:27 AM". Ich muss dieses Datum abrufen, indem Sie die wo eingeben Klausel kann jemand vorschlagen, wie kann ich das tun?Datumsformat in Where-Klausel-Oracle

+5

Eine Datumsspalte hat kein Format; ist es ein Datum oder eine Varchar-Spalte? – Aleksej

Antwort

3

Höchstwahrscheinlich das Datumsformat, das Sie sehen, ist das Format, das Ihr SQL-Tool (SQLplus, SQL Developer, Toad usw.) verwendet. Richtige Datum Spalten haben kein zugeordnetes Datum . Format

Um eine zuverlässige Abfrage für die Auswahl von Datum, explizit angeben, das Datumsformat in der Abfrage zu schreiben (sonst Oracle wir das Datumsformat aus dem aktuellen Sitzung verwenden):

SELECT * FROM T1 
WHERE DATE_COL > TO_DATE('7/25/2014 12:14:27 AM', 'MM/DD/YYYY HH:MI:SS AM'); 

Jedes anderes Datumsformat wird auch funktionieren:

SELECT * FROM T1 
WHERE DATE_COL > TO_DATE('2014-07-25 12:14:27', 'YYYY-MM-DD HH24:MI:SS'); 
+0

Hallo Ich habe die Antwort nach einigen google, unter Abfrage funktioniert gut: wo TO_CHAR (RECORD_UPDATE_DT, 'MM/TT/YYYY') = '05/12/2016 '. Danke für Ihre Zeit. –

+3

Wenn Ihre Datumsspalte einen Index hat, kann Ihre Abfrage diese nicht verwenden, da Sie mit einem Wert aus der Datumsspalte vergleichen. Wenn Sie den Index nutzen wollen, schauen Sie sich die MT0 oder meine Antwort an. – Codo

4

Daten (in Tabellen gespeichert) sind represented by 7 bytes - sie haben kein Format mit ihnen verbunden ist. Wenn sie als String formatiert sind, ist dies das Client-Programm, das Sie verwenden, um auf die Datenbank zuzugreifen, indem Sie eine eigene Formatierung auf das Datum anwenden (die Sie normalerweise über die Einstellungen in diesem Programm festlegen können).

Wenn das "Datum" in einem Format gespeichert ist, speichern Sie es nicht als Datum, sondern speichern es als Zeichenfolge (d. H. VARCHAR2).

Abfrage - wenn das Datum als Datum gespeichert:

SELECT * 
FROM table_name 
WHERE date_column = TO_DATE('7/25/2014 12:14:27 AM', 'MM/DD/YYYY HH12:MI:SS AM') 

oder unter Verwendung von ANSI/ISO-Literale:

SELECT * 
FROM table_name 
WHERE date_column = TIMESTAMP '2014-07-25 00:14:27' 

oder, wenn Sie Werte wollen, die für eine gerechte sind gegebener Tag dann:

SELECT * 
FROM table_name 
WHERE date_column >= DATE '2016-05-12' 
AND date_column < DATE '2016-05-13' 

(Dies ermöglicht es Ihnen, alle Indizes für die date_column Spalte zu verwenden)

oder nur einen einzigen Tag Wert vorbei (durch die Bindevariable :date_value dargestellt).

SELECT * 
FROM table_name 
WHERE date_column >= :date_value 
AND date_column < :date_value + INTERVAL '1' DAY 

Abfrage - wenn das „Datum“ wird als String gespeichert:

SELECT * 
FROM table_name 
WHERE TO_DATE(date_as_a_string_column, 'MM/DD/YYYY HH12:MI:SS AM') 
     = TIMESTAMP '2014-07-25 00:14:27' 

oder nur einfach:

SELECT * 
FROM table_name 
WHERE date_as_a_string_column = '7/25/2014 12:14:27 AM' 
+0

Hallo Habe die Antwort nach dem Ausführen einiger Google, unter Abfrage funktionierte gut: wo TO_CHAR (RECORD_UPDATE_DT, 'MM/TT/YYYY') = '05/12/2016 ' Danke für die Zeit. –

+3

@HemantSingh Während es funktioniert, ignoriert es auch alle Indizes, die Sie für die Spalte haben (es sei denn, Sie haben einen funktionsbasierten Index für TO_CHAR (RECORD_UPDATE_DT, MM/DD/YYYY)), so dass es weniger performant sein wird . Es ist besser, die rechte Seite (d.h. den Literalwert) in ein Datum umzuwandeln. – MT0