AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-Abfrage / Timestamp: Stunden in einem Bereich zählen
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von mirage228 · begonnen am 23. Nov 2007 · letzter Beitrag vom 26. Nov 2007
Antwort Antwort
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#1

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

  Alt 23. Nov 2007, 15:52
Datenbank: Firebird Embedded • Version: 2 • Zugriff über: Zeos
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 23. Nov 2007, 17:18
Zeig mal ein Beispiel für die Quellsätze.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 23. Nov 2007, 17:31
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 23. Nov 2007, 17:37
SQL-Code:
select
   ID, (iif( StartTime > Beginn, StartTime, Begin) - (iif( EndTime < Ende, EndTime, Ende)) as Dauer
from
   Tabelle
where ...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 23. Nov 2007, 18:22
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 23. Nov 2007, 18:26
Du könntest auch ne UDF wie z.B. F_MINUTESBETWEEN aus der FreeAdHOH_UDF Bibliothek verwenden um den wert als Minuten zu bekommen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#7

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

  Alt 26. Nov 2007, 16:30
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.
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 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