![]() |
Datenbank: Firebird Embedded • Version: 2 • Zugriff über: Zeos
SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
Hallo,
Ich schreibe gerade eine Datenbank-Anwendung bei der ich diverse Datensätze mit Start- und Endzeiten haben (Datentyp TIMESTAMP). Nun möchte ich mittels eine SQL-Abfrage bestimmen, wieviele Stunden (möglichst genau) zwischen Start- und Endzeit in einem bestimmten Bereich, wie etwa zwischen 22 und 24 Uhr, liegen. Dabei habe ich mehrere Zeitbereiche (zwischen 12 und 14 Uhr und 22 und 24 Uhr beispielsweise...). Die Datumsfunktionen die ich bisher für Firebird gefunden habe, gingen nur auf Tag, Woche oder das Jahr hinaus... Ist das in einer einzelnen SQL Abfrage überhaupt möglich? Was gäbe sonst für andere Möglichkeiten mit Firebird Embedded 2 in Verbindung mit ZEOS? mfG mirage228 |
Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
Zeig mal ein Beispiel für die Quellsätze.
|
Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
Hey mkinzler,
Also das ganze sieht so aus beispielsweise:
Code:
Id ist vom Typ "INTEGER", StartTime" und EndTime vom Typ "TIMESTAMP". Daneben gibt es noch einige Integer-Werte die aber hierfür nicht von Bedeutung sind.
[Id] [StartTime] [EndTime]
10 1.10.2007 11:23:04 1.10.2007 11:43:04 10 1.10.2007 11:46:03 1.10.2007 13:10:03 20 1.10.2007 22:05:04 1.10.2007 23:04:11 20 2.10.2007 2:11:04 2.10.2007 4:24:05 Also innerhalb einer ID gibt es keine Überschneidung, wohl aber evtl. zwischen mehreren IDs. In dem Beispiel hätte ID = 10 also insgesamt eine Zeit von 1 Stunden 44 Minuten (zwischen 11 und 14 Uhr, wenn ich mich nicht verrechnet habe...) mfG mirage228 |
Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
SQL-Code:
select
ID, (iif( StartTime > Beginn, StartTime, Begin) - (iif( EndTime < Ende, EndTime, Ende)) as Dauer from Tabelle where ... |
Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
Danke für Deine Antwort. :)
Es funktioniert soweit, zumindest kommen zwei Zahlen für die beiden Datensätze für den Testfall UserID 10 (s.o.) dabei raus:
Code:
Der fraktionale Anteil wird dann wahrs. die Zeitdifferenz sein...
39355,891006944
39355,906990741 Wenn ich mir das per FieldByName(...) als Float zurückgeben lasse (TimeStamp, DateTime, etc. geht nicht) und per TimeToStr() anzeigen lassen kommen da irgendwelche Zeitangaben bei raus, die aber nicht stimmen... Meine Abfrage schaut für die Parameter so aus (Habe "Beginn" durch comparebegin und "Ende" durch compareend ersetzt):
Delphi-Quellcode:
Wie muss ich das Ergebnis formatieren, damit ich die Anzahl der Stunden/Minuten/Sekunden erhalte? Kann ich überhaupt einfach bei den Parametern einfach 11 und 14 Uhr ohne Datumsangabe setzen?
ZQuery.ParamByName('comparebegin').AsSQLTimeStamp := DateTimeToSQLTimeStamp(
EncodeTime(11, 0, 0, 0)); ZQuery.ParamByName('compareend').AsSQLTimeStamp := DateTimeToSQLTimeStamp( EncodeTime(14, 0, 0, 0)); mfG mirage228 |
Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
Du könntest auch ne UDF wie z.B. F_MINUTESBETWEEN aus der FreeAdHOH_UDF Bibliothek verwenden um den wert als Minuten zu bekommen
|
Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
Zitat:
Mit deinem Code konnte ich auch so noch die folgende SQL-Abfrage bauen, die das gewünschte erledigt :) In etwa:
SQL-Code:
Den iif Vergleich habe ich dann mit "EXTRACT" gelöst, also EXTRACT(HOUR FROM Login) etc.
Select
Sum(iif( StartTime >= Beginn, StartTime, Begin) - (iif( EndTime =< Ende, EndTime, Ende))) as Dauer From Tabelle Where (UserId = :id) Das Ergebnis Dauer gibt man sich als Float zurück und TimeToStr() gibt dann die richtige Differenzzeit aus. Danke nochmal für Deine Hilfe :) mfG mirage228 Edit: SQL Abfrage modifiziert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz