2013-05-14 10 views
10

Die folgende Abfrage:Extrakt Datum nur aus bestimmten Zeitstempeln in Oracle SQL

select cdate from rprt where cdate <= TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002'; 

Rückkehr: 2013/04/27-10:06:26:794 wie in der Tabelle gespeichert.

Ich möchte das Datum nur als erhalten: 27-04-2013 und erhalten Sie die Anzahl der Tage zwischen dem Ergebnis und sysdate.

+0

SELECT to_date (create_date, 'TT-MM-JJJJ') sollte für Sie arbeiten. Probieren Sie es aus – ankurtr

+0

'FEHLER bei Zeile 1: ORA-01861: Literal stimmt nicht mit Formatzeichenfolge überein ' zeigt auf cdate. – kumarprd

+0

Entschuldigung. Da Sie bereits ein Datum haben, müssen Sie es in char umwandeln. Versuchen Sie also to_char (create_date, 'DD-MM-YYYY'). Es sollte Arbeit für Sie erledigen. – ankurtr

Antwort

8

Genau das ist TO_DATE() für: Zeitstempel auf Datum umrechnen.

Verwenden Sie einfach TO_DATE(sysdate) anstelle von TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS').

SQLFiddle demo

UPDATE:

Per Ihr Update, Ihre cdate Spalte ist nicht real DATE oder TIMESTAMP Typ, aber VARCHAR2. Es ist keine gute Idee, Zeichenkettentypen zu verwenden, um Daten zu behalten. Es ist sehr unbequem und langsam zu suchen, zu vergleichen und alle anderen Arten von Mathe auf Daten zu tun.

Sie sollten Ihr cdateVARCHAR2 Feld in echte TIMESTAMP konvertieren. Vorausgesetzt, es gibt keine anderen Benutzer für dieses Feld mit Ausnahme für den Code, können Sie cdate konvertieren zu wie folgt:

BEGIN TRANSACTION; 
-- add new temp field tdate: 
ALTER TABLE mytable ADD tdate TIMESTAMP; 
-- save cdate to tdate while converting it: 
UPDATE mytable SET tdate = to_date(cdate, 'YYYY-MM-DD HH24:MI:SS'); 

-- you may want to check contents of tdate before next step!!! 

-- drop old field 
ALTER TABLE mytable DROP COLUMN cdate; 
-- rename tdate to cdate: 
ALTER TABLE mytable RENAME COLUMN tdate TO cdate; 
COMMIT; 

SQLFiddle Demo

+0

Es wirft Fehler: 'FEHLER in Zeile 1: ORA-01861: Literal stimmt nicht mit Format Zeichenfolge überein – kumarprd

+0

Nun, [SQLFiddle Link] (http://www.sqlfiddle.com/#!4/d41d8/10899) funktioniert gut für 'sysdate'.Was gibt? Bist du sicher, dass du hier die ganze Geschichte erzählst? – mvp

+0

'SELECT to_date (cdate, 'TT-MM-JJJJ') von rprt, wobei cdate <= TO_DATE (sysdate, 'TT-MM-JJJJ') und ryg = 'R' und cnum = 'C002';' gib mir das Fehler – kumarprd

1

versuchen, diese Art von Format:

SELECT to_char(sysdate,'dd-mm-rrrr') FROM dual 
1

Zeitstempel zu Datum konvertieren, wie unten erwähnt, wird es sicher arbeiten -

select TO_DATE(TO_CHAR(TO_TIMESTAMP ('2015-04-15 18:00:22.000', 'YYYY-MM-DD HH24:MI:SS.FF'),'MM/DD/YYYY HH24:MI:SS'),'MM/DD/YYYY HH24:MI:SS') dt from dual 
0

Dieses Format ist für mich gearbeitet, für das erwähnte Datumsformat dh MM/DD/YYYY

SELECT to_char(query_date,'MM/DD/YYYY') as query_date 
FROM QMS_INVOICE_TABLE; 
+1

Damit haben Sie kein Datum. Du hast ein Varchar2 –

0

Wenn Sie den Wert aus dem Zeitstempel Spalte wollen als Datum Datentyp zurück zu kommen, verwenden Sie so etwas wie diese:

select trunc(my_timestamp_column,'dd') as my_date_column from my_table;