Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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. :)

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

  • Autor

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

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.