🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

[gelöst] Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von Acco » So 27. Dez 2020, 13:36

Moin liebe Helfer,

Die Abfrage "Geburtstage zwischen heute und (heute + 8 Tage)" funktioniert so weit. Ist jedoch ein Jahreswechsel im Zeitraum, klappts nicht, denn der Wert von "DAYOFYEAR(NOW())+8" liegt dann über 366. Das Problem ist also die WHERE-Klausel.
Ich finde einfach nicht raus, wie die richtige Syntax dafür lautet.
SELECT "N_ID", "Name", "Vorname", "Geburtstag", DAYOFYEAR( "Geburtstag" ), DAYOFYEAR( NOW( ) ), DAYOFYEAR( CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtstag", '-%m-%d' ) ) ) FROM "Adressen_1_2"."Namen" "Namen" WHERE DAYOFYEAR( "Geburtstag" ) BETWEEN DAYOFYEAR( NOW( ) ) AND DAYOFYEAR( NOW( ) ) + 8
Umgebung: Server: MariaDB 10, LibreOffice Base 7.02, openSUSE Leap 15.2.

Wer weiß Rat und kann mir helfen?

Gruß acco
Zuletzt geändert von Acco am Mo 28. Dez 2020, 14:11, insgesamt 1-mal geändert.
openSUSE Tumbleweed - LibreOffice 24.8.2.1

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von RobertG » So 27. Dez 2020, 21:25

Wie ist es mit der Möglichkeit, das ganze mit der Datumsdifferenz zu berechnen?
...WHERE CAST(CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtstag", '-%m-%d' ) ) AS DATE) BETWEEN CURRENT_DATE() AND DATE_ADD(CURRENT_DATE(), INTERVAL 8 DAY)
Habe ich jetzt nicht getestet ...
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von Acco » Mo 28. Dez 2020, 01:15

Danke Robert.
Ich habe die Abfrage wie angegeben geändert.
SELECT "N_ID", "Name", "Vorname", "Geburtstag", DAYOFYEAR( "Geburtstag" ), DAYOFYEAR( NOW( ) ),
DAYOFYEAR( CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtstag", '-%m-%d' ) ) )
FROM "Adressen_1_2"."Namen"
WHERE CAST(CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtstag", '-%m-%d' ) ) AS DATE) BETWEEN CURRENT_DATE() AND DATE_ADD(CURRENT_DATE(), INTERVAL 8 DAY)
Nun wird ein Fehler erzeugt:

Code: Alles auswählen

Syntaxfehler im SQL-Ausdruck /home/buildslave/source/libo-core/dbaccess/source/core/api/SingleSelectQueryComposer.cxx:108
Das sagt mir nur, dass die Syntax noch nicht richtig ist, die genaue Bedeutung erschließt sich mir nicht. Habe es mit "CURDATE()" anstelle "CURRENT_DATE()" vesucht, der Fehler bleibt genau so.

Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von RobertG » Mo 28. Dez 2020, 10:31

Hallo Acco,

ich hab's jetzt getestet. Hat mich erst einmal etwas Arbeit gekostet, da ich gestern erst die 15.2 von SuSE aufgespielt habe und ich das nie als Upgrade mache.

Du musst die Abfrage in direktem SQL ausführen lassen. Die GUI kommt wohl mit DATE_ADD zurecht. Aber auch sonst hat die Abfrage einen kleinen Fehler, weil ja nur die Geburtsdaten des aktuellen Jahres gesucht werden. Im kommenden Jahr kann dadurch niemand gefunden werden. Vermutlich gibt es da auch noch einfachere Lösungen, aber hier erst einmal die, die ich genommen habe:
SELECT "Name", "Geburtsdatum",
CASE WHEN
CAST(CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtsdatum", '-%m-%d' ) ) AS DATE) > NOW() THEN
CAST(CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtsdatum", '-%m-%d' ) ) AS DATE) ELSE
CAST(CONCAT( YEAR( NOW( ) )+1, DATE_FORMAT( "Geburtsdatum", '-%m-%d' ) ) AS DATE) END AS "Geburtstag"
FROM "test"."Person" "Person"
WHERE
CASE WHEN CAST(CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtsdatum", '-%m-%d' ) ) AS DATE) > NOW() THEN
CAST(CONCAT( YEAR( NOW( ) ), DATE_FORMAT( "Geburtsdatum", '-%m-%d' ) ) AS DATE) ELSE
CAST(CONCAT( YEAR( NOW( ) )+1, DATE_FORMAT( "Geburtsdatum", '-%m-%d' ) ) AS DATE) END
BETWEEN CURRENT_DATE() AND DATE_ADD(CURRENT_DATE(), INTERVAL 8 DAY)
Das funktioniert bei mir, wenn ich eben den direkten SQL-Modus anschalte. Als Geburtstag wird der nächste Geburtstag der Person ausgegeben. Muss gegebenenfalls statt > NOW() >= NOW() heißen.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von Freischreiber » Mo 28. Dez 2020, 12:09

Hallo Acco, Hallo Robert,

hier die Abfrage aus meiner Datenbank, die Geburtstage sieben Tage vor und nach dem aktuellen Datum ermitteln soll. Sie verwendet DATEDIFF und gerade merke ich, daß sie über den Jahreswechsel auch nicht funktioniert:

Code: Alles auswählen

SELECT "t-adressen"."Nachname", "t-adressen"."Vorname", "t-adressen"."Geburtsdatum" FROM "t-adressen" WHERE "t-adressen"."Geburtsdatum" IS NOT NULL AND DATEDIFF( 'dd', DATEADD( 'yy', - ( YEAR( CURRENT_DATE ) - 1900 ), CURRENT_DATE ), DATEADD( 'yy', - ( YEAR( "t-adressen"."Geburtsdatum" ) - 1900 ), "t-adressen"."Geburtsdatum" ) ) BETWEEN - 7 AND 7
Schade und trotzdem einen Guten Rutsch! :mrgreen:

Viele Grüße
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von Acco » Mo 28. Dez 2020, 14:11

Moin ihr Beiden,

@Robert
Super, Robert! Die Abfrage funktioniert bestens - auch im betreffenden Formular. Vielen Dank.
Und ja, openSUSE und LibreOffice installiere ich auch jedesmal neu und nicht als Update.

@Freischreiber
Vielen Dank. Unter Base funktioniert das gut, unter MariaDB-SQL kommt bei mir die Fehlermeldung 751 bezüglich DATEDIFF-Parameter.

Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: [gelöst] Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von gogo » Mo 28. Dez 2020, 15:39

... oder die "mathematische Lösung" so:

Code: Alles auswählen

set @DateLimit = DayOfYear(DATE_ADD( CURRENT_DATE(), INTERVAL 8 DAY));
SELECT * FROM meineTabelle
	WHERE	(DayOfYear(Geburtsdatum) - @DateLimit between 0 and -8)
		OR
		(DayOfYear(Geburtsdatum) - @DateLimit > (365 - 8));
... funktioniert auch über den Jahreswechsel
... "@DateLimit" wird man evtl. ausschreiben müssen, ich hab's hier nur wegen der besseren Übersichtlichkeit verwendet.
... statt (365-8) geht natürlich auch 357, sollte man aber mal die nächsten 14d brauchen ist das Statement mit den 8ern übersichtlicher...
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: [gelöst] Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von Acco » Mi 30. Dez 2020, 16:04

Hallo gogo,

herzlichen Dank für Deine Lösung. Gefällt mir wegen des kurzen Codes.

Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: [gelöst] Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von Freischreiber » Do 31. Dez 2020, 12:48

Hallo gogo,

das ist vermutlich eine Syntax für MariaDB?

Kann man das auch für HSQL (gesplittet) verwenden? Dieses "set @DateLimit..." kommt mir fremd vor.

Vielen Dank,

Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: [gelöst] Base/MariaDB (SQL): Geburtstage zwischen heute und (heute + 8 Tage)

Beitrag von gogo » Do 31. Dez 2020, 14:38

In MySQL/MariaDB kann man mit "SET @foo = 'bar';" eine temporäre Variable setzen. Diese ist innerhalb der aktuellen Connection gültig, d.h. solange sie gehalten wird, kann man mit @foo auf 'bar' zurückgreifen. Die Connections für MySQL und MariaDB werden in LO für die ganze aktuelle Laufzeit gehalten, außer man beendet sie explizit. Wenn man innerhalb einer Abfrage immer auf denselben Wert ("DayOfYear(DATE_ADD( CURRENT_DATE(), INTERVAL 8 DAY))") zurückgreift, ist es effizienter ihn vorher als Variable zu speichern.
Wenn die DB keine Variablen unterstützt, musst Du für jede Zeile rechnen. Statt @DateLimit setzt Du dann einfach "DayOfYear(DATE_ADD( CURRENT_DATE(), INTERVAL 8 DAY))" ein - oder Du verwendest eine eigene Tabelle, in der Du die Variablenwerte vorübergehend speicherst.

Eine andere Lösung wäre noch einen String-Vergleich zu machen, da weiß ich aber nicht wie das die unterschiedlichen Datenbanken machen. Für SQLite funktioniert z.B.:

Code: Alles auswählen

Select * from MeineTabelle
	where	(
		substr(date(), 1,4) ||       substr(Geburtsdatum,5) between date('now' ,'+1 day') and date('now' ,'+8 day') 
		or 
		(substr(date(), 1,4) + 1) || substr(Geburtsdatum,5) between date('now' ,'+1 day') and date('now' ,'+8 day')
		)
		and Geburtsdatum <> '' and substr(Geburtsdatum,1,4) between '1920' and '2020';
Dazu MUSS das Datum im Format "yyyy-mm-dd" gespeichert sein. Zu beachten ist dabei, dass das eben keine echten Datumsvergleiche sind, daher auch das and Geburtsdatum <> '' ... am Ende, wobei die Datenqualität hier entscheidend ist. "5936-88-45" ist auch im "yyyy-mm-dd"-Format ... aber Nonsens. "1976-9-25" würde z.B. am 27. Dezember einen Treffer ergeben, da substr(date(), 1,4) || substr("1976-9-25" ,5) "2020-9-25" ergibt und '2020-9' im Alphabet zwischen '2020-12-28' und '2021-01-03' liegt.

... tja und dann gibt's sicher auch noch einige andere Lösungen ;)
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten