2016-08-08 31 views
0

Ich muss Zeitstempel in PL SQL zu Datum konvertieren. Ich bekomme Eingang als '2016-08-01T09: 16: 47.000' von Webservice, ich benötige '8/01/2016 9:16:47'. Ich nehme den Eingang als VARCHAR2.Entfernen der Millisekunde aus dem Zeitstempel

Es kann "AM" oder "PM" sein.

Ich versuchte mit SELECT TRUNC (to_timestamp ('2016-08-01T09: 16: 47.000', 'JJJJ-MM-DD "T" HH24: MI: SS.ff3')) von Dual; aber der Zeitteil wird entfernt.

+0

Bitte zeigen Sie Ihren aktuellen Code - was Sie auf dem Laufenden vollständig scheitern würden wie in syntaktisch nicht gültig ist. –

+0

wählen Sie TRUNC (to_timestamp ('2016-08-01T09: 16: 47.000', 'JJJJ-MM-TT "T" HH24: MI: SS.ff3')) von Dual; –

+0

Frage-Tag sollte SQL sein, so dass man die beste Antwort geben kann. Schlecht getaggte Fragen werden nicht optimal beantwortet, – XING

Antwort

1
select to_char(to_timestamp('08/01/2016 09:16:47.000000000 AM', 'MM/DD/YYYY HH:MI:SS.FF AM'),'MM/DD/YYYY HH:MI:SS AM') from dual; 

Edit: Dies funktioniert für am oder pm

select to_char(to_timestamp('08/01/2016 09:16:47.000000000 PM', 'MM/DD/YYYY HH:MI:SS.FF AM'),'MM/DD/YYYY HH:MI:SS AM') from dual; 
+0

Upvote coz du hast es am ersten beantwortet. Kredit geht an Sie. – XING

+0

Es kann "AM" oder "PM" sein. –

+0

Dies funktioniert für am oder pm. – JDro04

0

Sie sollten to_char anstelle von trunc verwenden. In Ihrem Beispiel wäre der richtige Betrieb sein - to_char('08/01/2016 09:16:47.000000000 AM','dd:mm:yyyy hh:mi:ss am')

+0

Vermutlich wird hier eine NLS-Einstellung angenommen? ''08/01/2016 09: 16: 47.000000000 AM'' ist eine Zeichenkette, kein Zeitstempel, und wenn ich renne, bekomme ich' ORA-01722: ungültige Nummer'. –

1

Ihre Suche:

select TRUNC(to_timestamp('2016-08-01T09:16:47.000','YYYY-MM-DD"T"HH24:MI:SS.ff3')) 
    from dual; 

gibt einen date Wert. Wie Sie das anzeigen, hängt davon ab, mit welcher Formatmaske Sie diese in eine Zeichenkette umwandeln. Ohne eine Formatmaske wird die Standard-NLS-Einstellung verwendet, z. Ich bekomme:

SQL> select TRUNC(to_timestamp('2016-08-01T09:16:47.000','YYYY-MM-DD"T"HH24:MI:SS.ff3')) 
    from dual; 

TRUNC(TO_ 
--------- 
01-AUG-16 

becaiuse meine NLS_DATE_FORMAT Einstellung ist derzeit 'DD-MON-RR'. Unter Verwendung eine explizite Formatmaske:

1 select TO_CHAR(TRUNC(to_timestamp('2016-08-01T09:16:47.000','YYYY-MM-DD"T"HH24:MI:SS.ff3') 
    2     'YYYY-MM-DD HH:MI:SS AM') 
    3* from dual; 

TO_CHAR(TRUNC(TO_TIMES 
---------------------- 
2016-08-01 12:00:00 AM 

, dass diese trunc falsch war mit zeigt, wie es die Zeit ganz entfernt. Also:

1 select TO_CHAR(to_timestamp('2016-08-01T09:16:47.000','YYYY-MM-DD"T"HH24:MI:SS.ff3'), 
    2     'YYYY-MM-DD HH:MI:SS AM') 
    3* from dual; 

TO_CHAR(TO_TIMESTAMP(' 
---------------------- 
2016-08-01 09:16:47 AM 

Hinweis dies auch für PM mal funktioniert:

1 select TO_CHAR(to_timestamp('2016-08-01T13:16:47.000','YYYY-MM-DD"T"HH24:MI:SS.ff3'), 
    2     'YYYY-MM-DD HH:MI:SS AM') 
    3* from dual; 

TO_CHAR(TO_TIMESTAMP(' 
---------------------- 
2016-08-01 01:16:47 PM 
+0

Das "AM" ist fest codiert. In anderen Fällen kann es auch "PM" sein. –

+0

Kein Problem - siehe aktualisierte Antwort –

+0

Funktioniert gut. Danke!! –