View Full Version : [SQL] Numerisch in TIME
Allrounder
19-02-09, 13:17
Habe folgendes Problem:
Ich lese ein 6-stelliges numerisches Feld einer PF ein, und will es per SQL in ein Time-Feld einer SQL-Tabelle ausgeben.
Insert into ...
select ...
TIME(
SUBSTR(CHAR(TimeNum), 1, 2) || ':' || SUBSTR(CHAR(TimeNum), 3, 2) ||':'||
SUBSTR(CHAR(TimeNum), 5, 2)) ...
...funktioniert, solange alle sechs Stellen gefüllt sind, also ab 10 Uhr (100000). Uhrzeiten vor 10 Uhr (z.B. 95900) werden nicht umgesetzt, da die CHAR-Anweisung aus der führenden Null ein *blank macht.
Wie kann ich die SQL-Anweisung mehr oder weniger elegant erweitern, dass auch 5-stellige Uhrzeiten umgesetzt werden? Jemand eine Idee?
Allrounder
19-02-09, 13:30
Danke, habe die Lösung gefunden:
...
(case when TimeNum >= 100000 then
TIME(SUBSTR(CHAR(TimeNum), 1, 2) || ':' || SUBSTR(CHAR(TimeNum), 3, 2) ||':'|| SUBSTR(CHAR(TimeNum), 5, 2))
else
TIME('0' || SUBSTR(CHAR(TimeNum), 1, 1) || ':' || SUBSTR(CHAR(TimeNum), 2, 2) ||':'|| SUBSTR(CHAR(TimeNum), 4, 2))
end)
...
Aber vielleicht kennt ja jemand eine elegantere Lösung?
geht schief für 00:03:07
richtiger wäre in jedem Fall 1000000 auf TimeNum draufaddieren und dann die erste (jetzt immer echte Stelle) weglassen bei dem Substring Gedöns.
D*B
Danke, habe die Lösung gefunden:
...
(case when TimeNum >= 100000 then
TIME(SUBSTR(CHAR(TimeNum), 1, 2) || ':' || SUBSTR(CHAR(TimeNum), 3, 2) ||':'|| SUBSTR(CHAR(TimeNum), 5, 2))
else
TIME('0' || SUBSTR(CHAR(TimeNum), 1, 1) || ':' || SUBSTR(CHAR(TimeNum), 2, 2) ||':'|| SUBSTR(CHAR(TimeNum), 4, 2))
end)
...
Aber vielleicht kennt ja jemand eine elegantere Lösung?
Allrounder
19-02-09, 13:51
geht schief für 00:03:07
richtiger wäre in jedem Fall 1000000 auf TimeNum draufaddieren und dann die erste (jetzt immer echte Stelle) weglassen bei dem Substring Gedöns.
D*B
Stimmt, habe ich nicht bedacht.
Das vorherige aufaddieren ist eine gute Lösung, dann kann ich mir auch das Case-Geraffel sparen :-).
Danke
wie wärs einfach mit
Insert into ...
select ...
TIME(
SUBSTR(DIGITS(TimeNum), 1, 2) || ':' || SUBSTR(DIGITS(TimeNum), 3, 2) ||':'||
SUBSTR(DIGITS(TimeNum), 5, 2)) ...
Hallo,
CHAR richtet linksbündig aus!
Einfacher geht es mit DIGITS. Außerdem sollte || oder !! vermieden werden, da beides nicht international ist. Stattdessen sollte concat verwendet werden:
Select time(substr(digits(ZeitNum), 1, 2) concat '.' concat
substr(digits(ZeitNum), 3, 2) concat '.' concat
substr(digits(ZeitNum), 5, 2))
from x
Eine andere Version wäre:
Select time('00010101' concat Digits(ZeitNum))
from x
Birgitta
Allrounder
19-02-09, 14:23
Danke für die vielen, gewohnt schnellen Antworten.
...
Eine andere Version wäre:
Select time('00010101' concat Digits(ZeitNum))
from x
Birgitta
Gefällt mir am besten und funktioniert auch noch :-).
Leider verstehe ich die Anweisung nicht. Was hat es mit '00010101' auf sich?
LG Allrounder
Das ist ein Datum: 1.1.0001
Durch diese Anweisung wird ein Timestamp erstellt, aus dem TIME() halt nur den Zeitanteil entnimmt.
Allrounder
19-02-09, 14:36
Danke, jetzt ist alles klar.
Schöne Lösung, Birgitta.