Anmelden

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?

BenderD
19-02-09, 13:44
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

Fuerchau
19-02-09, 13:51
wie wärs einfach mit

Insert into ...
select ...
TIME(
SUBSTR(DIGITS(TimeNum), 1, 2) || ':' || SUBSTR(DIGITS(TimeNum), 3, 2) ||':'||
SUBSTR(DIGITS(TimeNum), 5, 2)) ...

B.Hauser
19-02-09, 13:53
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

Fuerchau
19-02-09, 14:31
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.