AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi In SQL Zeitraum abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

In SQL Zeitraum abfragen

Ein Thema von harfes · begonnen am 14. Okt 2024 · letzter Beitrag vom 15. Okt 2024
Antwort Antwort
Seite 1 von 2  1 2      
harfes

Registriert seit: 25. Jun 2006
Ort: Rand der Scheibe
194 Beiträge
 
Delphi 11 Alexandria
 
#1

In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 10:01
Datenbank: Firebird • Version: 3 • Zugriff über: IBDAC
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
Hartmut
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.613 Beiträge
 
Delphi 12 Athens
 
#2

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 10:06
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:
WHERE YEAR(DatumStart) <= Jahr AND YEAR(DatumEnde) >= Jahr
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.379 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 10:11
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)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.381 Beiträge
 
Delphi 12 Athens
 
#4

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 10:43
Hallöle...
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.

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

Geändert von haentschman (14. Okt 2024 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.392 Beiträge
 
Delphi 12 Athens
 
#5

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 11:35
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:
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:
WHERE (YEAR(DatumStart) = :Jahr) OR (YEAR(DatumEnde) = :Jahr) OR ((YEAR(DatumStart) < :Jahr) AND (YEAR(DatumEnde) > :Jahr))
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.613 Beiträge
 
Delphi 12 Athens
 
#6

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 11:52
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
harfes

Registriert seit: 25. Jun 2006
Ort: Rand der Scheibe
194 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 12:35
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
Hartmut
  Mit Zitat antworten Zitat
harfes

Registriert seit: 25. Jun 2006
Ort: Rand der Scheibe
194 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 14:00
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
Hartmut
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 14:28
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.
Ralph

Geändert von Jumpy (14. Okt 2024 um 14:30 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: In SQL Zeitraum abfragen

  Alt 14. Okt 2024, 15:02
where Datumstart <= last_day(of year from 2024) and DatumEnde >= first_day( of year from 2024);
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:34 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