Zum Inhalt springen

SQL-Query: Zeit umwandeln


Carwyn

Empfohlene Beiträge

Hallo miteinander,

okay, ich übersehe mit Sicherheit irgendetwas total simples, aber ich will das Thema abgehakt haben, von daher hoffe ich, dass Ihr mir weiterhelfen könnt.

In einer Oracle-Datenbank sind Zeiten hinterlegt, soweit ich das sehe in Sekunden. Beispiel: Die Uhrzeit 17:15 ist in der Datenbank hinterlegt als 62100000. Da das natürlich bei einer Abfrage im Result Set keinem was sagt, muss die Zeit also umgerechnet werden.

Zu diesem Zweck gab uns die Firma, deren Software in der Datenbank schreibt eine Umrechnungsformel, die im Grunde funktioniert, aber irgendwie doch nicht...

cast(floor(termin.startzeit/3600000) as varchar2(2)) || ':' || 

case 

  when (round((termin.startzeit/3600000)-floor(termin.startzeit/3600000))/(1/60)) < 10

  then '0' 

end || 

cast(round(((termin.startzeit/3600000)-floor(termin.startzeit/3600000))/(1/60)) as varchar2(2))

AS STARTZEIT

Wenn ich da richtig durchsteige, macht er folgendes:

1.) Er teilt den Wert durch 360000 und rundet den Wert ab, um die Stundenanzahl zu bekommen. In diesem Fall ist das Ergebnis 17,25, abgerundet 17. Das castet er dann in einen String, damit er konkatinieren kann und hängt einen Doppelpunkt dran.

2.) Er prüft ob der Ursprungswert (17,25) minus der abgerundeten Wert (17) geteilt durch 1/60 (was dem Minutenwert (15) entspricht), kleiner 10 ist. Ist dies der Fall, wird eine 0 geschrieben. Ist es nicht der Fall, wird an dieser Stelle nichts gemacht.

3.) Er gibt den Minutenwert (15) aus.

Rein der Logik folgend müsste er bei dem Beispiel sehen, dass 15 > 10 ist und dementsprechend keine 0 schreiben und als Ergebnis sollte ein String rauskommen in der Form: 17:15

Tatsächlich schreibt er aber 17:015. Dieses Verhalten zeigt er meiner Kenntnis nach bis zu einer Minutenzahl von 25, ab 30 verhält er sich korrekt und hängt keine 0 mehr dran.

Ich hab inzwischen einiges ausprobiert und bspw. die < 10 umgeändert in = 15, nur um zu sehen was passiert. Ergebnis war, dass er bei der 15 KEINE 0 anhing, dafür überall anders.

So ganz kann ich mir das Verhalten nicht erklären, denn im Grunde wirkt die Logik bei dem Statement schlüssig. Allerdings bin ich nicht der SQL-Crack und im Zweifel liegt es an irgendwelchen Hochkommata o.ä. weswegen der Case sich falsch verhält.

Wäre super, wenn mir jemand helfen könnte. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Fehler dürfte bei 2.) liegen. Denn nachdem er den Stundenwert vom Ursprungswert abgezogen hat, rundet er erstmal, das heißt bei allem was < 0,5 ist, rundert er ab. Erst danach rechnet er die Minuten aus, sodass alles bis zur 30. Minute in der Rechnung < 10 ergibt, da die Minutenanzahl dann immer 0 ergeben hat.

Meiner Meinung nach müsste es so aussehen:


when (round((termin.startzeit/3600000)-floor(termin.startzeit/3600000)/(1/60))) < 10

Wobei das round() wahrscheinlich auch ganz weggelassen werden kann.

Bearbeitet von Dragon8
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich wusste doch, dass es nur so ein Mist sein konnte! Danke Dragon. Ich war irgendwie davon ausgegangen, dass round im Gegensatz zu floor immer aufrundet. Aber nein, dadurch dass er rundet nach Ergebnis, kam natürlich bis 0,49 immer 0 (und 0 * 60 ist nunmal 0 => < 10) raus und ab 0,5 immer 1. Das erklärt auch die Schwelle bei 30 Minuten!

Meine Lösung ist tatsächlich nichts anderes als den Ausdruck ohne round zu nehmen. Also:

when (((termin.startzeit/3600000)-floor(termin.startzeit/3600000))/(1/60)) < 10

Bist ein Schatz! :e@sy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was ich in so Fällen immer ganz gerne mache ist folgendes :

(TSQL)

right('0' + convert(varchar(2), [minuten als integer]) , 2) 

Also im Endeffekt immer die 0 anverketten, und dann die letzten 2 Zeichen des resultierenden Strings. Das gibt dir immer eine 2 stellige Angabe, ohne dass da was schief gehen kann. Sollte auch recht performat sein denke ich, so viel ist da an Aufwand nicht dahinter bei ner String Verkettung nen nem Substring.....

Gruß

Sven

Bearbeitet von streffin
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...