2012-03-30 10 views
1

Ich habe ein Textfeld, das ein Datum ist, obwohl es manchmal auch die Zeit Komponente hat. Ex:Oracle 10g - Entfernen Zeit Komponente

"23/1/1999" 
"25/2/2003 05:18:00" 

Nun, ich möchte sie einfach und Reihenfolge der Datumskomponente abfragen nur. Mein Versuch

TO_DATE(
     TO_CHAR(
      TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS') 
     ,'DD-MM-YYYY') 
,'MON-YYYY') 

Die oben nicht auf der äußeren TO_DATE (ORA-01843 ungültig Monat.)

TO_CHAR(
    TO_DATE(mytextfield , 'DD-MM-YYYY HH:MI:SS') 
,'DD-MM-YYYY') 

Die oben genannten Arbeiten, aber ich bin mit einem String links, kein Datum.

-------- Lösung akzeptierte Antwort mit

Gerade

EXTRACT(MONTH FROM TO_DATE(timetable.string_time) , 'DD-MM-YYYY HH24:MI:SS')) 

EXTRACT(YEAR FROM TO_DATE(timetable.string_time) , 'DD-MM-YYYY HH24:MI:SS')) 

verwenden Wie auf der Antwort angegeben, können Sie die Reihenfolge Sie es in der ORDER BY verwenden tauschen und in der AUSWAHL.

Benötigen eine kleine Zahlenformatierung für den Monat, und einige Konkatas, aber das funktioniert sehr gut.

Antwort

6

NLS_DATE_FORMAT gibt das Standarddatumsformat für die Verwendung mit den Funktionen TO_CHAR und TO_DATE an. Lassen Sie uns es schön Ausgabe von SQL * erhalten ändern Plus-:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 

Zuerst haben wir TO_DATE verwenden, um die Textdarstellung des Datums in Echt Datum Typ zu konvertieren (beachten Sie, dass das Datumsformat unter den kürzeren Text akzeptiert):

SELECT TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS') FROM DUAL; 
2003-02-25 05:18:00 

SELECT TO_DATE('25/2/2003', 'DD-MM-YYYY HH24:MI:SS') FROM DUAL; 
2003-02-25 00:00:00 

Zweitens - wir wollen das Datum kürzen unnötige Felder loszuwerden (TRUNC-Funktion):

SELECT TRUNC(TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS')) FROM DUAL; 
2003-02-25 00:00:00 

SELECT TRUNC(TO_DATE('25/2/2003 05:18:00', 'DD-MM-YYYY HH24:MI:SS'),'MONTH') FROM DUAL; 
2003-02-01 00:00:00 

Jetzt können Sie diese verwenden in ORDER BY oder GROUP BY vorausgesetzt, dass Sie die Bestellung basierend auf Jahr/Monat/Tag (und so weiter) wollen.

Wenn Sie einige exotische Sortierung tun möchten (für die Gruppierung ist es egal: {year,month} ist nicht anders als {month, year}) - z. Monat/Jahr, dann denke ich, dass Sie die einzelnen Felder zusammensetzen und folgendes verwenden müssen:

SELECT EXTRACT(MONTH FROM DATE '1998-03-07') FROM DUAL; 
3 

SELECT EXTRACT(YEAR FROM DATE '1998-03-07') FROM DUAL; 
1998 
+2

+1, aber ich wette, dass das 'HH'' HH24' sein muss. – ruakh

+0

Sie haben Recht. Korrigiert. – Anonymous

+0

Aber heiß, um das Datum, nach TRUNC, in ein MON-YYYY-Format zu ändern? Ich schaffe es nicht. –

Verwandte Themen