Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen (https://www.delphipraxis.net/103889-sql-abfrage-timestamp-stunden-einem-bereich-zaehlen.html)

mirage228 23. Nov 2007 14:52

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

mkinzler 23. Nov 2007 16:18

Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
 
Zeig mal ein Beispiel für die Quellsätze.

mirage228 23. Nov 2007 16:31

Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
 
Hey mkinzler,

Also das ganze sieht so aus beispielsweise:

Code:
[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
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.
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

mkinzler 23. Nov 2007 16:37

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

mirage228 23. Nov 2007 17:22

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:
39355,891006944
39355,906990741
Der fraktionale Anteil wird dann wahrs. die Zeitdifferenz sein...
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:
  ZQuery.ParamByName('comparebegin').AsSQLTimeStamp := DateTimeToSQLTimeStamp(
    EncodeTime(11, 0, 0, 0));
  ZQuery.ParamByName('compareend').AsSQLTimeStamp := DateTimeToSQLTimeStamp(
    EncodeTime(14, 0, 0, 0));
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?

mfG
mirage228

mkinzler 23. Nov 2007 17:26

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

mirage228 26. Nov 2007 15:30

Re: SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
 
Zitat:

Zitat von mkinzler
Du könntest auch ne UDF wie z.B. F_MINUTESBETWEEN aus der FreeAdHOH_UDF Bibliothek verwenden um den wert als Minuten zu bekommen

Ah okay, danke für den Tipp. Mit den UDF muss ich aber noch mal weitergehender beschäftigen...

Mit deinem Code konnte ich auch so noch die folgende SQL-Abfrage bauen, die das gewünschte erledigt :)

In etwa:
SQL-Code:
Select
  Sum(iif( StartTime >= Beginn, StartTime, Begin) - (iif( EndTime =< Ende, EndTime, Ende))) as Dauer
From
  Tabelle
Where
  (UserId = :id)
Den iif Vergleich habe ich dann mit "EXTRACT" gelöst, also EXTRACT(HOUR FROM Login) etc.

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 23:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz