![]() |
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 |
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
|
AW: In SQL Zeitraum abfragen
Zitat:
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) |
AW: In SQL Zeitraum abfragen
Hallöle...8-)
Delphi-Quellcode:
...bitte für die Zukunft grundsätzlich Parameter benutzen wegen SQL Injection. :warn:
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)+'); 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...:| |
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))
|
AW: In SQL Zeitraum abfragen
Zitat:
|
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 |
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 |
AW: In SQL Zeitraum abfragen
SQL-Code:
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.
Where Datumstart <= make_date(2024, 12, 31) and DatumEnde >= make_date(2024, 1, 1)
// |
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. |
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