Hello Vinzenz,
select * from zeit
where datediff
(
date_add(now(), interval 7 day),
concat(year(now()),'-',month(birthday),'-',day(birthday))
)
between 0 and 7;
> > so geht es.
>
> nein, so geht es nicht immer. [suit](https://forum.selfhtml.org/?t=186764&m=1240651) hatte bereits auf den Jahreswechsel hingewiesen, den Dein Code nicht berücksichtigt. suit vergaß allerdings auf die Schaltjahrproblematik hinzuweisen, die bei der Verwendung von DAYOFYEAR zusätzlich berücksichtigt werden muss.
Stimmt. Ertappt. Dabei habe ich wohl im Kreis gedacht.
Aber der betrachtete Bereich verlässt ja den gültigen für year(now())...
Ok, das könnte man einfach fixen, indem man das nächste Jahr auch abfragt. Da sich diese beiden Bereiche nicht überschneiden, dürfte es passen.
Und für den 29. Februar, der mMn nach als amtlicher Geburtstag nicht angegeben wird, müsste wohl ein if() her?
~~~sql
select * from zeit
where datediff
(
date_add(now(), interval 7 day),
concat(year(now()),'-',month(birthday),'-',if(month(birthday) = 2 and day(birthday)= 29,28,day(birthday))
)
between 0 and 7
or datediff
(
date_add(now(), interval 7 day),
concat((year(now())+1),'-',month(birthday),'-',if(month(birthday) = 2 and day(birthday)= 29,28,day(birthday))
)
between 0 and 7
;
Dein Code vernachlässigt die Schaltjahresproblematik in der Form, dass Personen nicht am 29. Februar geboren sein dürfen :-)
der 29.02.2009 lässt sich gar nicht eintragen in die DB
mysql> insert into zeit set name="Vierauge", birthday='2009-02-29';
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from zeit;
+----+------------+------------+
| id | name | birthday |
+----+------------+------------+
| 1 | NULL | 1958-02-08 |
| 2 | Margret | 1933-01-07 |
| 3 | Wolfgang | 1930-08-25 |
| 4 | Elke | 1964-12-03 |
| 5 | Louisa | 1984-01-15 |
| 6 | Thomas | 1958-02-08 |
| 7 | Paul | 1960-05-20 |
| 8 | Paula | 1970-05-21 |
| 9 | Paulinchen | 1970-05-12 |
| 10 | Vierauge | 0000-00-00 |
+----+------------+------------+
10 rows in set (0.00 sec)
während sich für ein Jahr, in dem es einen 29. Februar gibt, dieser auch angenommen wird. MySQL ist also auch hier inzwischen etwas schlauer geworden.
mysql> insert into zeit set name="Willi-2008", birthday='2008-02-29';
Query OK, 1 row affected (0.00 sec)
mysql> select * from zeit;
+----+------------+------------+
| id | name | birthday |
+----+------------+------------+
| 1 | NULL | 1958-02-08 |
| 2 | Margret | 1933-01-07 |
| 3 | Wolfgang | 1930-08-25 |
| 4 | Elke | 1964-12-03 |
| 5 | Louisa | 1984-01-15 |
| 6 | Thomas | 1958-02-08 |
| 7 | Paul | 1960-05-20 |
| 8 | Paula | 1970-05-21 |
| 9 | Paulinchen | 1970-05-12 |
| 10 | Vierauge | 0000-00-00 |
| 11 | Willi-2008 | 2008-02-29 |
+----+------------+------------+
11 rows in set (0.00 sec)
Der Code sollte jetzt nur eine Anregung sein, für den Fall, dass man den 29.02.2009 tatsächlich berücksichtigen müsste. Da diese Datum aber bei MySQL 5.0.51a (bei mir hier noch verwendet) gar nicht mehr eingetragen werden kann, sollte es also ohne zusätzliche Bedingungen gehen.
Vermutlich müsste der Code er für eine "amtliche" Geburtstagswoche sowieso noch komplizierter werden, weil die Geburtstagslinder in DE vom 29. Februar auf den ersten März verfrachtet werden.
Man müsste also auch erst noch etwas über die lokalen Gesetzmässigleiten wissen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg