[NEWSboard IBMi Forum]

Thema: SQL Timestamp

  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    181

    SQL Timestamp

    Hallo Zusammen,
    ich habe zwei Felder beide numerisch (leider noch eine uralt Tabelle):
    Feld 1 (ODREGD) beinhaltet das Datum im Format ddmmccyy = 24022021
    Feld 2 (ODREGT) beinhaltet die Uhrzeit im Format hhmmss = 172601

    Nun sollen beide für einen Vergleich in ein Timestamp Feld umgewandelt werden.

    SQL:
    select odregd, odregt, timestamp(substr(digits(odregd), 1, 2) || '.' || substr(digits(odregd), 3, 2) || '.' || substr(digits(odregd), 5, 4)
    || ' ' || substr(digits(odregt), 1, 2) || ':' || substr(digits(odregt), 3, 2) || ':' || substr(digits(odregt), 5, 2)) from spefil.odtrnp;

    Result:
    ODREGD ODREGT 00003
    02092013 85203 (null)
    24092013 95945 (null)
    24092013 95945 (null)
    24092013 95945 (null)
    24092013 95945 (null)
    24092013 95809 (null)
    7012014 145445 (null)
    7012014 145634 (null)
    17022014 90631 (null)
    17022014 90642 (null)

    Was mache ich hier beim timestamp falsch?

    Danke.
    Gruß Klaus

  2. #2
    Registriert seit
    Nov 2020
    Beiträge
    80
    Hallo Klaus,

    Ich kann dir hier regex sehr ans Herz legen:

    Code:
    with orig as (select * from table (values ('2092013', '85203'), ('24092013', '95945'), ('24092013', '95945'), ('24092013', '95945'), ('24092013', '95945'), ('24092013', '95809'), ('7012014', '145445'), ('7012014', '145634'), ('17022014', '90631'), ('17022014', '90642')                                   ) t1 (ODREGD, ODREGT)
    )
    select orig.*, 
             timestamp (
                   date (regexp_replace(varchar(ODREGD), '(.*)(..)(....)', '$3-$2-$1')),
                   time (regexp_replace(varchar(ODREGT), '(.*)(..)(..)', '$1:$2:$3'))
                )
    from orig
    lg Andreas

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.709
    So funktioniert das nicht! Wenn Du versuchst eine Zeitmarke zusammenzustoppeln, muss diese im Format 'YYYY-MM-DD-HH.MI.SS.000000' oder 'YYYY-MM-DD HH:MI:SS.000000 oder 'YYYYMMDDHHMISS' sein. Europäisches Format, also DD.MM.YYYY ist in dem String nicht zulässig.

    Ansonsten könnte man auch die Funktion Timestamp_Format verwenden, bei der man das Format im 2. Parameter vorgeben kann:
    Code:
    Select x.*, 
           Timestamp_Format(Digits(ODREGD) concat Digits(ODREGT), 'DDMMYYYYHH24MISS')
      from spefil.odtrnp x
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion 2021
    Virtuelle SQL und RPG Schulungen

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.709
    @Andreas:
    Regular Expressions scheint wohl Dein neues Steckenpferd zu sein

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion 2021
    Virtuelle SQL und RPG Schulungen

  5. #5
    Registriert seit
    Nov 2020
    Beiträge
    80
    Zitat Zitat von B.Hauser Beitrag anzeigen
    @Andreas:
    Regular Expressions scheint wohl Dein neues Steckenpferd zu sein

    Birgitta
    Hehe, ja eigentlich schon seit vielen Jahren. :-)
    Ist erstaunlich was man damit alles machen kann.
    Nicht nur zum Programmieren, sondern auch wenn ich z.B. alle möglichen Arten von Listen umstrukturieren/erweitern möchte.
    Mail-Addressen/Passwort-Check, kann man mit 1 regexp_count() durchführen lassen.

    Auch hier, da die Spalten ODREGD und ODREGT unterschiedlich lang sein können (z.B. wenn Uhrzeit < 10 ist, also 08 Uhr, fehlt hier eine Stelle mit der führenden 0), klappt das alles mit SUBSTRING & Co erst recht wieder nicht und man muss weiter herumdoktern.

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.709
    Zitat Zitat von Andreas_Prouza Beitrag anzeigen
    Auch hier, da die Spalten ODREGD und ODREGT unterschiedlich lang sein können (z.B. wenn Uhrzeit < 10 ist, also 08 Uhr, fehlt hier eine Stelle mit der führenden 0), klappt das alles mit SUBSTRING & Co erst recht wieder nicht und man muss weiter herumdoktern.
    Deshalb konvertiert man an dieser Stelle auch nicht mit VarChar() oder Char(), sondern mit Digits(), da bleiben die Ziffern wo sie sind und führende Nullen werden ausgegeben ... und schon klappts mit dem Substring, den man im übrigen gar nicht braucht.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion 2021
    Virtuelle SQL und RPG Schulungen

  7. #7
    Registriert seit
    Sep 2004
    Beiträge
    181
    Zitat Zitat von B.Hauser Beitrag anzeigen
    So funktioniert das nicht! Wenn Du versuchst eine Zeitmarke zusammenzustoppeln, muss diese im Format 'YYYY-MM-DD-HH.MI.SS.000000' oder 'YYYY-MM-DD HH:MI:SS.000000 oder 'YYYYMMDDHHMISS' sein. Europäisches Format, also DD.MM.YYYY ist in dem String nicht zulässig.

    Ansonsten könnte man auch die Funktion Timestamp_Format verwenden, bei der man das Format im 2. Parameter vorgeben kann:
    Code:
    Select x.*, 
           Timestamp_Format(Digits(ODREGD) concat Digits(ODREGT), 'DDMMYYYYHH24MISS')
      from spefil.odtrnp x
    Birgitta

    @Birgitta, vielen Dank für den Code, damit funktioniert es bestens und ist auch schnell genug.

Ähnliche Themen

  1. CAST TIMESTAMP
    Von tarkusch im Forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 26-07-17, 16:34
  2. Timestamp über ODBC
    Von Wwilson im Forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 24-06-14, 16:26
  3. Query und Feld mit TIMESTAMP oder aktuelle Uhrzeit / Datum
    Von Franz.Rung im Forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 04-11-13, 16:54
  4. ILE Cobol: accept aTimestamp from timestamp?
    Von rebe im Forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 26-09-01, 08:46

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •