2017-07-07 9 views
3
select 
to_timestamp(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF') as SCHEDULED_TIME, 
TRUNC(to_date(to_timestamp(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF'),'YYYY-MM-DD HH24:MI:SS')) 
from S_TIDAL_STATUS 

Der Fehler war: ORA-01830: Datumsformat Bild endet vor gesamte Eingabezeichenfolge 01830. 00000 Umwandlung - „Datumsformat Bild endet vor gesamte Eingabezeichenfolge umzuwandeln“PL SQL - Konvertieren Zeitstempel Datumzeit/Datum

Das Ziel ist so etwas wie

2017-07-91 23:14:00 (ohne den Inhalt nach dem Punkt) zurückzukehren.

Hier ist, was die SCHEDULED_TIME (Timestamp) sah aus wie: enter image description here

+0

Hallo, Sie haben ** to_char (SCHEDULED_TIME versucht,‘ JJJJ-MM-TT HH24: MI: SS ') **? – hmmftg

+0

Sie benötigen dafür kein PL/SQL. Sieht nach einer einfachen SQL-Frage aus. –

Antwort

1

Dies sollte den Trick:

select 
to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF') as time_to_csecs, 
to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS') as time_to_secs, 
TRUNC(to_date(to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')) as time_to_day 
from S_TIDAL_STATUS 

Bitte die Dokumentation überprüfen den Unterschied zwischen to_timestamp und to_char zu sehen.

+0

hmm was ist der grund, dass es zuerst in string umgewandelt werden muss? nur neugierig –

+0

@AnnaHuang Wenn Sie den Zeitstempel nicht in einen String konvertieren, dann wird sqldeveloper einen String basierend auf der aktuellen Einstellung von NLS_TIMESTAMP_FORMAT (für Zeitstempel) oder NLS_DATE_FORMAT (für Datum) anzeigen. Im Wesentlichen wird sqldeveloper (und sqlplus und fast jede andere Adhoc-Anwendung) die Oracle-API der Wahl verwenden, um alle Datentypen zu Strings zu zwingen, indem die API angewiesen wird, die Konvertierung durchzuführen. Mit anderen Worten, die App fordert Oracle auf, Strings anstelle von Werten in ihrem nativen Datentyp (db) zurückzugeben. Es macht es einfacher für Leute, Apps wie sqldeveloper und sqlplus zu schreiben. – jeff6times7

+0

@ jeff6times7 - eigentlich ist es die Oracle-Datenbank-Engine selbst, die die impliziten Konvertierungen durchführen wird, nicht das Front-End (SQL Developer oder SQL \ * Plus). Aber sonst ist die Erklärung richtig. – mathguy

4

Das Problem in Ihrem Versuch ist die Funktion TO_DATE() auf einen Zeitstempel angewendet. TO_DATE() verwendet eine VARCHAR2 (Zeichenfolge) -Eingabe, keinen Zeitstempel. Daher konvertiert Oracle den Zeitstempel zuerst implizit in einen String, indem er den Parameter NLS_TIMESTAMP_FORMAT verwendet, und versucht dann, diese Zeichenfolge in ein Datum zu konvertieren. Abhängig von Ihrem NLS_TIMESTAMP_FORMAT können verschiedene Fehler auftreten.

Die Möglichkeit, einen Zeitstempel in ein Datum (datetime) zu konvertieren - während die Bruchteile einer Sekunde abgeschnitten werden - erfolgt mit der CAST-Funktion. Beispiel:

select systimestamp, 
     cast (systimestamp as date) as ts_cast_to_date 
from dual 
; 

Alternativ kann, wenn alle Saiten genau in diesem Format sind, können Sie die Saiten zuerst gestutzt und gelten TO_DATE direkt:

to_date(substr(scheduled_time, 1, 19), 'yyyy-mm-dd hh24:mi:ss')