Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi In SQL Zeitraum abfragen (https://www.delphipraxis.net/216015-sql-zeitraum-abfragen.html)

harfes 14. Okt 2024 10:01

Datenbank: Firebird • Version: 3 • Zugriff über: IBDAC

In SQL Zeitraum abfragen
 
Ich sehe gerade den Wald vor lauter Bäumen nicht: ich habe in einer Tabelle Teilnehmer zu einer Veranstaltung zugeordnet (jede Veranstaltung hat in der Tabelle ein Start- und Ende-Datum). Diese Veranstaltungen laufen häufig auch über den Jahreswechsel. Nun möchte ich z.B. in 2024 die Anzahl der Teilnehmer abfragen, die aktiv an Veranstaltungen teilnehmen und dazu gehören auch die Teilnehmer, die in 2023 gestartet sind und deren Veranstaltung bis irgendwann in 2024 (oder sogar bis 2025) läuft. Veranstaltungen, die bereits in 2023 beendet wurden sollen dabei natürlich nicht mehr berücksichtigt werden. Mit einer Abfrage nach Datumstart und/oder Datumende komme ich da nicht weiter, aber ich sehe gerade nicht, wie es gehen müsste - ich bin für Ideen offen...

Hier mal mein Versuch, 2024 abzufragen:

DM1.DataModule1.IBCQuery1.SQL.Add('select VERANSTALTUNGSID from VERANSTALTUNGEN ');
DM1.DataModule1.IBCQuery1.SQL.Add('where (DATUMSTART>'+QuotedStr('01.01.'+ComboBox1.Text)+' and DATUMENDE<'+QuotedStr('31.12.'+ComboBox1.Text)+');


Hartmut

DeddyH 14. Okt 2024 10:06

AW: In SQL Zeitraum abfragen
 
Wenn ich keinen Denkfehler mache, müsste doch dann das Jahr des Startdatums kleiner oder gleich und das Jahr des Enddatums größer oder gleich dem abzufragenden Jahr sein, oder?
Also etwa so:
SQL-Code:
WHERE YEAR(DatumStart) <= Jahr AND YEAR(DatumEnde) >= Jahr

Lemmy 14. Okt 2024 10:11

AW: In SQL Zeitraum abfragen
 
Zitat:

Zitat von harfes (Beitrag 1542147)
Hier mal mein Versuch, 2024 abzufragen:

DM1.DataModule1.IBCQuery1.SQL.Add('select VERANSTALTUNGSID from VERANSTALTUNGEN ');
DM1.DataModule1.IBCQuery1.SQL.Add('where (DATUMSTART>'+QuotedStr('01.01.'+ComboBox1.Text)+' and DATUMENDE<'+QuotedStr('31.12.'+ComboBox1.Text)+');


also gestartet irgend wann vor dem 31.12.2024 und beendet zwischen dem 1.1. und 31.12.

Datum_Start <= 31.12.2024 AND (DatumEnde >= 1.1.2024 AND DatumEnde <= 31.12.2024)

haentschman 14. Okt 2024 10:43

AW: In SQL Zeitraum abfragen
 
Hallöle...8-)
Delphi-Quellcode:
DM1.DataModule1.IBCQuery1.SQL.Add('select VERANSTALTUNGSID from VERANSTALTUNGEN ');
DM1.DataModule1.IBCQuery1.SQL.Add('where (DATUMSTART>'+QuotedStr('01.01.'+ComboBox1.Text)+' and DATUMENDE<'+QuotedStr('31.12.'+ComboBox1.Text)+');
...bitte für die Zukunft grundsätzlich Parameter benutzen wegen SQL Injection. :warn:

Grundsätzliche Frage:
Ist das "DATUMSTART" Feld ein TimeStamp/Datum Feld oder ein String Feld? :gruebel: Aus SQL abgeleitet...Ich vermute mal ein String Feld. :? Da kommst schwer auf ein richtiges Ergebnis...:|

Uwe Raabe 14. Okt 2024 11:35

AW: In SQL Zeitraum abfragen
 
Solange zwischen Start- und End-Datum nicht mehr als ein Jahr liegt, fallen dann nicht alle Intervalle in 2024, bei denen das Start- oder das End-Datum in 2024 liegt (beide fällt natürlich auch darunter).

Also, in etwa eine modifizierte Antwort von Detlev:
SQL-Code:
WHERE (YEAR(DatumStart) = :Jahr) OR (YEAR(DatumEnde) = :Jahr)


Nur für den Fall, dass die genannte Einschränkung nicht gilt, müsste man den Fall noch gesondert abfangen:
SQL-Code:
WHERE (YEAR(DatumStart) = :Jahr) OR (YEAR(DatumEnde) = :Jahr) OR ((YEAR(DatumStart) < :Jahr) AND (YEAR(DatumEnde) > :Jahr))

DeddyH 14. Okt 2024 11:52

AW: In SQL Zeitraum abfragen
 
Zitat:

dazu gehören auch die Teilnehmer, die in 2023 gestartet sind und deren Veranstaltung bis irgendwann in 2024 (oder sogar bis 2025) läuft.
Daraus habe ich geschlossen, dass so eine Veranstaltung auch über mehr als ein Jahr gehen kann, daher die relativ einfache Abfrage.

harfes 14. Okt 2024 12:35

AW: In SQL Zeitraum abfragen
 
Danke für eure zahlreichen Tips! Ich werde jetzt mal testen... Und um es noch zu präzisieren: es kann sein das eine Veranstaltung in 2023 beginnt und erst in 2025 endet. Ich muss also abfragen, wieviel Teilnehmer in 2024 betreut werden müssen - das trifft dan ja auf alle zu, die in 2023 begonnen haben und im ganzen Jahr 2024 dabei sind. Zur Info: die Felder Datumstart und Datumende sind in der Tabelle der DB als DATE deklariert (also kein String).

Hartmut

harfes 14. Okt 2024 14:00

AW: In SQL Zeitraum abfragen
 
So, jetzt habe ich mal die Variante von DeddyH getestet (J=2024):

DM1.DataModule1.IBCQuery1.SQL.Add('select VERANSTALTUNGSID from VERANSTALTUNGEN ');
DM1.DataModule1.IBCQuery1.SQL.Add('where ((EXTRACT(YEAR from DatumStart) <= '+QuotedStr(IntToStr(J))+') and (EXTRACT(YEAR from DatumEnde) >= '+QuotedStr(IntToStr(J))+')) ');

Der code funktioniert zwar - ABER: es ist egal, ob ich für J 2024 oder 2023 oder 2022 eingebe, es kommt immer das gleiche Ergebnis dabei heraus. Da alle Veranstaltungen irgendwie vor/in oder in/nach 2024 starten/enden, kann das so nicht funktionieren...

Dann habe ich die Variante von Uwe Raabe getestet:

DM1.DataModule1.IBCQuery1.SQL.Add('where ( (EXTRACT(YEAR from DatumStart) = '+QuotedStr(IntToStr(J))+') or (EXTRACT(YEAR from DatumEnde) = '+QuotedStr(IntToStr(J))+') ');
DM1.DataModule1.IBCQuery1.SQL.Add('or ((EXTRACT(YEAR from DatumStart) < '+QuotedStr(IntToStr(J))+' and (EXTRACT(YEAR from DatumEnde) > '+QuotedStr(IntToStr(J))+'))) ');

Leider auch nicht besser...nur anderes Ergebnis. Mache ich einen Denkfehler oder muss die Abfrage anders verschachtelt werden?

Hartmut

Jumpy 14. Okt 2024 14:28

AW: In SQL Zeitraum abfragen
 
SQL-Code:
Where Datumstart <= make_date(2024, 12, 31) and DatumEnde >= make_date(2024, 1, 1)
//
Wobei make_date postgreSQL ist. Mit der entsprechenden Firebird Funktion ersetzen (im MSSQL wäre das DateFromParts oder so). Es geht darum, dass man die 2024 dabei ersetzen kann.

mkinzler 14. Okt 2024 15:02

AW: In SQL Zeitraum abfragen
 
SQL-Code:
where Datumstart <= last_day(of year from 2024) and DatumEnde >= first_day( of year from 2024);


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 Uhr.
Seite 1 von 2  1 2      

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