2017-11-24 1 views
0

Ich habe eine Tabelle, die einen Zeitstempel Nummer TEST1 (TIMESTAMP) enthält und ich möchte TEST2 eine andere Tabelle erstellen, die (TIMESTAMP, TIME) aus der ersten Tabelle zeigt (das TIME Feld der timstamp zu date umgewandelt anzeigt). Ich versuchte diesesInsert Daten konvertieren bisher aus einer vorhandenen Tabelle

insert into TEST2 
values (TEST1.TIMESTAMP,to_date('1970-01-01 ','yyyy-mm-dd ') + 
(TEST1.TIMESTAMP)/60/60/24 ,'YYYY-MM-DD'); 

kann Hilfe haben!

+0

Was gezeigt wird in Klammern SOLLTE der Datentyp sein. Ist der Datentyp von "TEST1" tatsächlich "TIMESTAMP"? (Sind Sie 100% sicher? Wenn nicht, können Sie den Befehl 'DESCRIBE' verwenden, um das herauszufinden.) Ich frage, weil Sie sagten, die Tabelle" enthält einen Zeitstempel ** Nummer ** 'TEST1 (TIMESTAMP)'. " Der Datentyp 'Zeitstempel' ist keine ** Nummer **. Welcher Teil ist richtig und welcher ist falsch? Die Antwort auf Ihre Frage hängt entscheidend davon ab, also bitte klären Sie dies zuerst. – mathguy

+0

Sie verwenden SAP mit einer Oracle-Datenbank? Und vom Zeitstempel entfernst du die Zeit, um das Datum zu erhalten, aber du nennst diese Spalte "Zeit"? Seltsam. Wie auch immer, benutze 'TRUNC', um den Datumsteil eines Zeitstempels zu erhalten. –

+0

@mathguy es war nur ein Beispiel, das Timestamp-Feld ist eine Zahl, die große Zahlen enthält, die in Sekunden sind, aber der Feldtyp ist immer noch in NUMBER (20), –

Antwort

1

Angenommen, die TIMESTAMP-Spalte ist wirklich in Sekunden, Ihr Code ist fast richtig. Allerdings: to_date('1970-01-01', 'yyyy-mm-dd') ist richtig, aber dazu müssen Sie eine Nummer hinzufügen - schlicht und einfach. Das ist: + TIMESTAMP/60/60/24. Genau so!

Oder, um Rundungsfehler zu vermeiden, könnten Sie so etwas wie

to_date('1970-01-01', 'yyyy-mm-dd') + interval '1' second * test1.timestamp 

Hinweis tun, dass der Termin auch Schließlich

date '1970-01-01' 

einfach als geschrieben werden kann: Wenn Sie das Datum speichern möchten Teil, wickeln Sie das Ergebnis dieser Addition innerhalb TRUNC(...) - die auf den Anfang des Tages verkürzt. Oder Sie können den arithmetischen Ausdruck ohne INTERVAL und ohne TRUNC verwenden, aber stattdessen fügen Sie TRUNC(TEST1.TIMESTAMP)/60/60/24 hinzu - das wird die Sekunden auf eine ganze Anzahl von Tagen abschneiden.

Beachten Sie, dass Datumsangaben in Oracle kein "Format" haben (Format gilt nur für Textdarstellungen von Daten, nicht für Daten selbst).

BEARBEITEN: Es scheint, dass Sie auch Hilfe mit der INSERT-Anweisung benötigen. Wenn Sie mit Daten aus einer anderen Tabelle in eine Tabelle einfügen, fügen Sie nicht INSERT ... VALUES ein, Sie INSERT ... SELECT. So etwas wie (Ihr schlecht gewählte Spaltennamen - schlecht gewählt, weil sie Oracle Schlüsselwörter sind):

insert into test2 (timestamp, time) 
    select timestamp, date '1970-01-01' + trunc(timestamp/60/60/24) 
    from test1 
; 

Hinweis, dass es keine Anrufe auch immer entweder TO_CHAR oder TO_DATE; und es gibt kein Formatmodell wie 'JJJJ-MM-TT'. Eine der guten Eigenschaften des SQL-Standard-Datumsliterals date '1970-01-01' ist, dass nur ein Format akzeptiert wird: 'yyyy-mm-dd' (selbst die Bindestriche sind obligatorisch; / würde abgelehnt).

Wenn Sie sehen wollen, was jetzt in der Tabelle TEST2 ist:

select timestamp, time from test2; 

Und wenn Sie nicht mögen, wie das Datum angezeigt wird, können Sie das steuern kann:

select timestamp, to_char(time, 'yyyy-mm-dd') as time from test2; 
+0

das Feld in Sekunden, aber Die Idee ist, dass ich eine andere Tabelle erstellen, die das Feld plus die konvertierten Felder enthält, teste ich wie in Tabelle einfügen, wähle Feld aus ...., es funktioniert aber wenn j 'das konvertierte Feld einfügen (to_char (to_date (... .)) es funktioniert nicht –

+0

@AnassEL - TO_CHAR und TO_DATE nicht zufällig verwenden TO_DATE sollte niemals für etwas verwendet werden, das bereits ein Datum ist und niemals TO_CHAR verwenden, um einen Wert zu generieren, der in einer DATE-Spalte gespeichert werden soll Die Zeit für die Verwendung von TO_CHAR ist später, wenn Sie Daten aus der Tabelle abrufen und sie für die Berichterstellung vorbereiten - dh wenn Sie einen Datumswert (in einem nicht lesbaren Format) verwenden und ihn in ein lesbares Textformat konvertieren – mathguy

+0

I t Hank Sie für Ihre Hilfe, aber nicht die Dinge zu komplizieren, für die Anfrage, die ich Ihnen zeigte und wenn ich es tue to_date ('1970-01-01', 'JJJJ-MM-TT') + (TEST1.TIMESTAMP)/60/60/24, 'JJJJ-MM-TT') es funktioniert gut, aber die Idee ist, dass ich eine andere Tabelle erstellen möchte, die ein Feld anzeigt, das die Daten aus der ersten Tabelle konvertiert, das Problem, das ich habe ist in der Einfügung in der zweiten Tabelle enthalten, wie kann ich wie eine Abfrage verwenden? @ mathguy –

Verwandte Themen