Seite 1 von 1
Wer hat diese Woche Geburtstag?
Verfasst: Sa 18. Apr 2015, 10:42
von Freischreiber
Hallo,
beim Abfragen meiner Adressen mit
Code: Alles auswählen
SELECT "t-adressen"."Nachname", "t-adressen"."Vorname", "t-adressen"."Geburtsdatum", DAYOFWEEK( "Geburtsdatum" ) AS "Tagnummer Gebtag", DAYOFWEEK( CURDATE( ) ) AS "Tagnummer heute", WEEK( "Geburtsdatum" ) AS "Woche GebTag" , WEEK( CURDATE() ) AS "Woche heute" FROM "t-adressen" WHERE WEEK( "Geburtsdatum" ) = WEEK( CURDATE( ) )
bekomme ich das seltsame Ergebnis, daß Geburtstage in der nächsten Woche (Tag 1 der Woche nach SQL) schon heute (Samstag, Tag 7 der Woche nach SQL) angezeigt werden, wenn man die Wochenzahlen vergleicht. Vermutlich fängt, wenn freitags Silvester ist, gleich am Samstag mit Neujahr die erste Woche an und am Sonntag drauf schon die zweite?
Wie macht man es richtig, wenn für heute (curdate) die Geburtstage
a) der aktuellen Kalenderwoche oder
b) der nächsten sieben Tage angezeigt werden sollen?
Gruß
Freischreiber
Re: Wer hat diese Woche Geburtstag?
Verfasst: Sa 18. Apr 2015, 14:39
von Freischreiber
Danke fürs Daumendrücken, ich hab hier:
http://www.sqlservercentral.com/Forums/ ... 323-1.aspx
was nettes gefunden:
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 -2 AND 7
Es macht aus den Datumsangaben aller Jahre solche im Jahr 1900 und berechnet dann die Tagdifferenz.
Re: Wer hat diese Woche Geburtstag?
Verfasst: Sa 18. Apr 2015, 16:56
von F3K Total
Hi,
ist es nicht einfacher, den Geburtstag im aktuellen Jahr zu berechnen ...
Code: Alles auswählen
DATEADD('YY',DATEDIFF('YY',"Geburtsdatum",CURRENT_DATE),"Geburtsdatum")
... und dann die Tagesdifferenz?
Code: Alles auswählen
... WHERE DATEDIFF('DD',CURRENT_DATE, DATEADD('YY',DATEDIFF('YY',"Geburtsdatum",CURRENT_DATE),"Geburtsdatum")) <= 7
Gruß R
Re: Wer hat diese Woche Geburtstag?
Verfasst: Sa 18. Apr 2015, 17:10
von Freischreiber
Hi R!
Lange nichts gelesen von dir...
Einfacher, naja, es sieht auf jeden Fall frischer aus. Aber beide haben das Problem, daß sie zwischen Weihnachten und Neujahr nicht funktionieren.
Gruß
Freischreiber
Re: Wer hat diese Woche Geburtstag?
Verfasst: Sa 18. Apr 2015, 20:03
von RobertG
Hallo Freischreiber,
hier der Versuch einer Lösung für die interne HSQLDB, die ja kein DATEADD kennt:
Code: Alles auswählen
SELECT "Geburtsdatum"
FROM "Tabelle"
WHERE
DAYOFYEAR("Geburtsdatum") BETWEEN DAYOFYEAR(CURDATE()) AND DAYOFYEAR(CURDATE())+7
OR DAYOFYEAR("Geburtsdatum") < 7 - DAYOFYEAR(CAST(YEAR(CURDATE())||'-12-31' AS DATE)) + DAYOFYEAR(CURDATE())
Habe ich jetzt nicht intensiv getestet, scheint aber zu funktionieren. Natürlich habe ich mir besonders den Jahreswechsel angesehen. Mit der Addition von 7 werden dann natürlich insgesamt 8 Tage angezeigt.
Dann gibt es noch einen Haken mit dem Schaltjahr. Das ist allerdings ein bisschen viel Code, wenn es DATEADD nicht gibt:
Code: Alles auswählen
SELECT "Datum"
FROM "Tabelle"
WHERE
CASE
WHEN DAYOFYEAR(CAST(YEAR("Datum")||'-12-31' AS DATE)) = 366 AND DAYOFYEAR("Datum") > 60 THEN DAYOFYEAR("Datum") - 1
ELSE DAYOFYEAR("Datum")
END
BETWEEN
CASE
WHEN DAYOFYEAR(CAST(YEAR(CURDATE())||'-12-31' AS DATE)) = 366 AND DAYOFYEAR(CURDATE()) > 60 THEN DAYOFYEAR(CURDATE()) - 1
ELSE DAYOFYEAR(CURDATE())
END
AND
CASE
WHEN DAYOFYEAR(CAST(YEAR(CURDATE())||'-12-31' AS DATE)) = 366 AND DAYOFYEAR(CURDATE()) > 60 THEN DAYOFYEAR(CURDATE()) + 6
ELSE DAYOFYEAR(CURDATE()) + 7
END
OR DAYOFYEAR("Datum") < 7 - DAYOFYEAR(CAST(YEAR(CURDATE())||'-12-31' AS DATE)) + DAYOFYEAR(CURDATE())
Gruß
Robert
Re: Wer hat diese Woche Geburtstag?
Verfasst: So 19. Apr 2015, 10:39
von Freischreiber
Hallo Robert,
danke, werde ich auch mal testen - und versuchen zu verstehen.
Mir schwebt noch was ganz anderes vor, irgendwas mit modulo 365, Tage seit dem Geburtstag durch 365 und Rest nach Division auswerten, aber...
So vielleicht:
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
MOD ( DATEDIFF ( CURRENT_DATE, "t-adressen"."Geburtsdatum" ), 365 ) < 7
DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )
This special form of DATEDIFF does not have a field parameter and return the number of days between two dates.
(
http://hsqldb.org/doc/guide/builtinfunctions-chapt.html
So kriege ich heute aber immer noch Treffer wie den 04.05.1938, also irgendwie geht das noch nicht richtig...
Gruß
Freischreiber
Re: Wer hat diese Woche Geburtstag?
Verfasst: So 19. Apr 2015, 21:02
von RobertG
Hallo Freischreiber,
mit DATEDIFF zählst Du genauso die Tage des 29.2. im Schaltjahr dazu. Zurückgezählt auf 1938 hast Du da über Modulo schon allein einen "Rest" von 19 - wenn Du den 19.4.1938 anzeigen willst. Gehe ich dann davon so weit runter wie zu dem von Dir angestrebten Rest, so < 7, dann lande ich folglich beim 1. bis 6.4.1938.
Gruß
Robert
Re: Wer hat diese Woche Geburtstag?
Verfasst: Mo 20. Apr 2015, 11:31
von Freischreiber
Hallo Robert,
Schaltjahre! Blödes Sonnensystem
Dann probier ich jetzt deine Lösung mal aus.
Danke und Gruß,
Freischreiber