Zeit aus Timstamp extrahieren und nach 3-Schichten sortieren

gummela

Neuer Benutzer
Beiträge
2
Guten tag,

ich habe bis jetzt folgendes:

to_date(to_char(fahr_termin, 'dd.mm.yyyy'), 'dd.mm.yyyy')
between to_date('16.02.2015', 'dd.mm.yyyy')and to_date('22.02.2015', 'dd.mm.yyyy')

Datum
16.02.15
16.02.15
16.02.15
17.02.15
17.02.15
17.02.15
18.02.15
18.02.15
18.02.15

Damit selektiere ich Datensätze welche zwischen diesen Tagen existieren. Nun möchte ich eine weitere Spalte einfügen. So soll es aussehen:

Datum Schicht
16.02.15 F
16.02.15 S
16.02.15 N
17.02.15 F
17.02.15 S
17.02.15 N
18.02.15 F
18.02.15 S
18.02.15 N

F = Frühschicht = 6:30 - 14:30
S = Spätschicht = 14:30 - 22:30
N = Nachtschicht = 22:30 - 6:30

Dahinter sind dann die Kilometer, welche pro Schicht zurückgelegt wurden.

Wie kann ich dies realisieren?
 
Werbung:
Guten tag,

ich habe bis jetzt folgendes:


Datum
16.02.15
16.02.15
16.02.15
17.02.15
17.02.15
17.02.15
18.02.15
18.02.15
18.02.15

Damit selektiere ich Datensätze welche zwischen diesen Tagen existieren. Nun möchte ich eine weitere Spalte einfügen. So soll es aussehen:

Datum Schicht
16.02.15 F
16.02.15 S
16.02.15 N
17.02.15 F
17.02.15 S
17.02.15 N
18.02.15 F
18.02.15 S
18.02.15 N


Wie kann ich dies realisieren?

Um mal deine Tabelle zu simulieren:

Code:
test=*# create view tage as select ('2015-02-15'::date + s * '1day'::interval)::date from generate_series(0,10)s cross join generate_series(1,3)x;   
CREATE VIEW   
Time: 76,073 ms   
test=*#   
test=*#   
test=*# select * from tage;   
  date   
------------   
 2015-02-15   
 2015-02-15   
 2015-02-15   
 2015-02-16   
 2015-02-16   
 2015-02-16   
 2015-02-17   
 2015-02-17   
 2015-02-17   
 2015-02-18   
 2015-02-18   
 2015-02-18   
 2015-02-19   
 2015-02-19   
 2015-02-19   
 2015-02-20   
 2015-02-20   
 2015-02-20   
 2015-02-21   
 2015-02-21   
 2015-02-21   
 2015-02-22   
 2015-02-22   
 2015-02-22   
 2015-02-23   
 2015-02-23   
 2015-02-23   
 2015-02-24   
 2015-02-24   
 2015-02-24   
 2015-02-25   
 2015-02-25   
 2015-02-25   
(33 rows)

Nun wills da immer F, S oder N dranpappen, das ginge z.B. so:

Code:
test=*# select date, case when r=1 then 'F' when r=2 then 'S' else 'N' end from (select *, row_number() over (partition by date) as r from tage) foo;
  date  | case
------------+------
 2015-02-15 | F
 2015-02-15 | S
 2015-02-15 | N
 2015-02-16 | F
 2015-02-16 | S
 2015-02-16 | N
 2015-02-17 | F
 2015-02-17 | S
 2015-02-17 | N
 2015-02-18 | F
 2015-02-18 | S
 2015-02-18 | N
 2015-02-19 | F
 2015-02-19 | S
 2015-02-19 | N
 2015-02-20 | F
 2015-02-20 | S
 2015-02-20 | N
 2015-02-21 | F
 2015-02-21 | S
 2015-02-21 | N
 2015-02-22 | F
 2015-02-22 | S
 2015-02-22 | N
 2015-02-23 | F
 2015-02-23 | S
 2015-02-23 | N
 2015-02-24 | F
 2015-02-24 | S
 2015-02-24 | N
 2015-02-25 | F
 2015-02-25 | S
 2015-02-25 | N
(33 rows)

Das generate_Series() kann MySQL nicht, aber das ist ja hier auch nur zum erzeugen der Tabelle da. Schwieriger wird es mit row_number(): das kann MySQL auch nicht. Bei Stackoverflow und anderen Seiten findest da vielleicht eine Lösung zur Emulation.
 
Werbung:
Ich finde es erschreckend, dass ein Primärschlüssel zur Laufzeit generiert werden soll...
Wäre es nicht wesentlich sinnvoller diesen schon bei der Datenanlage einzupflegen?
Mach aus deinem 'Date' ein 'Datetime' und speicher die Daten so:

01.03.2015 06:30:00
01.03.2015 14:30:00
01.03.2015 22:30:00

dann kannst du auch ganz einfach mithilfe eines extract "zu deinen Zeichen konvertieren".
Noch besser... Wenn es irgendwann einmal nötig sein sollte... Kannst du damit sogar rechnen :)
 
Zurück
Oben