| | | | |
| |||||||
| Datenbanken SQL und Co |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Moderator Registriert seit: 11.05.2008
Beiträge: 6.266
![]() ![]() ![]() ![]() ![]() ![]() ![]() | So wird das Geburtsdatum wohl nicht vorliegen. Du musst das Jahr des Geburtstages ersetzen, und zwar wenn der diesjährige Geburtstag schon rum ist, dann mit dem nächsten Jahr, andernfalls mit dem aktuellen. Danach sortieren und limitieren. Code: SELECT
IF (
DAYOFYEAR(CURDATE()) < DAYOFYEAR(gebtag)), -- Geburtstag vorbei?
DATE_FORMAT(gebtag, CONCAT(YEAR(CURDATE()), '-%m-%d')), -- Nein: dann Geburtsjahr mit dem aktuellen ersetzen
DATE_FORMAT(gebtag, CONCAT(YEAR(CURDATE()) + 1, '-%m-%d')) -- Ja: dann Geburtsjahr mit dem nächsten Jahr ersetzen
) AS gebtag_aktuell -- und Alias erzeugen
FROM
ORDER BY
IF (
DAYOFYEAR(CURDATE()) < DAYOFYEAR(gebtag)), -- gleiche Prozedur (muss soweit ich weiß, andernfalls probier mal nach ORDER BY gebtag_aktuell DESC zu sortieren)
DATE_FORMAT(gebtag, CONCAT(YEAR(CURDATE()), '-%m-%d')),
DATE_FORMAT(gebtag, CONCAT(YEAR(CURDATE()) + 1, '-%m-%d'))
) DESC
Zum Thema Schaltjahre musst du dann eben Strings bauen, will heißen: auf DAYOFYEAR() verzichten. Du musst das eigentlich nur mal auf dem Papier aufmalen: 29. Februar 200x vs 1. März 200x. PHPs Datumsfunktionen können dir beispielsweise den 29. Februar, wenn es ihn nicht gibt, automatisch auf den 1. März umdrücken. Denke die MySQL hat ähnliche Fähigkeiten.
__________________ "Nuschel ich?" - "Was?" Geändert von Chriz (14.05.2010 um 20:17 Uhr). |
| | |
| | |
| Gast
Beiträge: n/a
| So jetzt aber nochmal. noch ein paar Testdaten dazu ( 2009 und 2008 ) Code: INSERT INTO geburtstag VALUES (13, 'Fritz-13', '2009-01-10'), (14, 'Fritz-14', '2009-02-10'), (15, 'Fritz-15', '2009-03-10'), (16, 'Fritz-16', '2009-04-10'), (17, 'Fritz-17', '2009-05-10'), (18, 'Fritz-18', '2009-06-10'), (19, 'Fritz-19', '2009-07-10'), (20, 'Fritz-20', '2009-08-10'), (21, 'Fritz-21', '2009-09-10'), (22, 'Fritz-22', '2009-10-10'), (23, 'Fritz-23', '2009-11-10'), (24, 'Fritz-24', '2009-12-10'); INSERT INTO geburtstag VALUES (25, 'Fritz-25', '2008-01-10'), (26, 'Fritz-26', '2008-05-10'), (27, 'Fritz-27', '2008-10-10'); Code: mysql> SELECT * FROM geburtstag
-> ORDER BY gebtag
-> ;
+----+----------+------------+
| id | name | gebtag |
+----+----------+------------+
| 25 | Fritz-25 | 2008-01-10 |
| 26 | Fritz-26 | 2008-05-10 |
| 27 | Fritz-27 | 2008-10-10 |
| 13 | Fritz-13 | 2009-01-10 |
| 14 | Fritz-14 | 2009-02-10 |
| 15 | Fritz-15 | 2009-03-10 |
| 16 | Fritz-16 | 2009-04-10 |
| 17 | Fritz-17 | 2009-05-10 |
| 18 | Fritz-18 | 2009-06-10 |
| 19 | Fritz-19 | 2009-07-10 |
| 20 | Fritz-20 | 2009-08-10 |
| 21 | Fritz-21 | 2009-09-10 |
| 22 | Fritz-22 | 2009-10-10 |
| 23 | Fritz-23 | 2009-11-10 |
| 24 | Fritz-24 | 2009-12-10 |
| 1 | Fritz-1 | 2010-01-10 |
| 2 | Fritz-2 | 2010-02-10 |
| 3 | Fritz-3 | 2010-03-10 |
| 4 | Fritz-4 | 2010-04-10 |
| 5 | Fritz-5 | 2010-05-10 |
| 6 | Fritz-6 | 2010-06-10 |
| 7 | Fritz-7 | 2010-07-10 |
| 8 | Fritz-8 | 2010-08-10 |
| 9 | Fritz-9 | 2010-09-10 |
| 10 | Fritz-10 | 2010-10-10 |
| 11 | Fritz-11 | 2010-11-10 |
| 12 | Fritz-12 | 2010-12-10 |
+----+----------+------------+
27 rows in set (0.00 sec)
mysql>
Code: SELECT name, gebtag FROM geburtstag WHERE DATE_FORMAT(gebtag, '%m.%d') >= DATE_FORMAT(CURRENT_DATE(),'%m.%d') AND DATE_FORMAT(gebtag,'%Y') < DATE_FORMAT(CURRENT_DATE(),'%Y') ORDER BY DATE_FORMAT(gebtag,'%m.%d') LIMIT 5; +----------+------------+ | name | gebtag | +----------+------------+ | Fritz-18 | 2009-06-10 | | Fritz-19 | 2009-07-10 | | Fritz-20 | 2009-08-10 | | Fritz-21 | 2009-09-10 | | Fritz-22 | 2009-10-10 | +----------+------------+ 5 rows in set (0.01 sec) Okay, den 29.02. muss ich noch testen... Grüße Thomas |
|
| | |
| Moderator Registriert seit: 11.05.2008
Beiträge: 6.266
![]() ![]() ![]() ![]() ![]() ![]() ![]() | Damit wirst du zum Jahreswechsel Probleme haben: Heute 31.12., morgen hat aber Geburtstag Neujahrskind Hans-Peter, der wäre in deiner WHERE-Bedingung schon rausgeflogen. Drum musst du das Geburtsjahr ersetzen (Bedingung ob schon heuer gewesen) und danach kannst du erst sortieren.
__________________ "Nuschel ich?" - "Was?" |
| | |
| | |
| Gast
Beiträge: n/a
| Nun eine neue Idee zur Geburtstagsliste. Die Logik habe ich in ein Stored Procedure gelegt, damit die SQL übersichtlicher sind. Das Ganze ist eine spezielle MySLQ Lösung. -- Die Tabelle plus Testdaten Code: CREATE TABLE geburtstag ( id INT NOT NULL, name VARCHAR(50) NOT NULL, gebtag DATE NOT NULL ); INSERT INTO geburtstag VALUES (1, 'Fritz-1', '2004-02-29'), (2, 'Fritz-2', '2008-02-29'), (3, 'Fritz-3', '2005-01-01'), (4, 'Fritz-4', '2004-12-31'), (5, 'Fritz-5', '2007-02-01'), (6, 'Fritz-6', '2007-03-01'), (7, 'Fritz-7', '2007-04-01'), (8, 'Fritz-8', '2007-05-01'), (9, 'Fritz-9', '2007-06-01'), (10, 'Fritz-10', '2007-07-01'), (11, 'Fritz-11', '2007-08-01'), (12, 'Fritz-12', '2007-09-01'); Code: SELECT * FROM geburtstag ORDER BY DATE_FORMAT(gebtag,'%m.%d'); +----+----------+------------+ | id | name | gebtag | +----+----------+------------+ | 3 | Fritz-3 | 2005-01-01 | | 5 | Fritz-5 | 2007-02-01 | | 1 | Fritz-1 | 2004-02-29 | | 2 | Fritz-2 | 2008-02-29 | | 6 | Fritz-6 | 2007-03-01 | | 7 | Fritz-7 | 2007-04-01 | | 8 | Fritz-8 | 2007-05-01 | | 9 | Fritz-9 | 2007-06-01 | | 10 | Fritz-10 | 2007-07-01 | | 11 | Fritz-11 | 2007-08-01 | | 12 | Fritz-12 | 2007-09-01 | | 4 | Fritz-4 | 2004-12-31 | +----+----------+------------+ 12 rows in set (0.00 sec) mysql> -- Ein Stored Procedure für die Logik Code: DELIMITER $$
CREATE FUNCTION BirthdayCheckLeapYear(dtDatum DATE)
RETURNS CHAR(5) DETERMINISTIC
BEGIN
DECLARE sDatum CHAR(10);
DECLARE dtNewDate DATE;
DECLARE sDatum29 CHAR(10);
DECLARE dtNewDate29 DATE;
SET sDatum = DATE_FORMAT(dtDatum, '%Y-%m-%d');
IF (substr(sDatum,6,5) = '02-29') THEN
-- Datum ist z.B '2008-02-29' => '2007-03-01'
SET dtNewDate = DATE_SUB(dtDatum, INTERVAL 1 YEAR); -- 28.02. xx
SET dtNewDate = DATE_ADD(dtNewDate, INTERVAL 1 DAY); -- 01.03.
ELSEIF (substr(sDatum,6,5) = '03-01') THEN
-- Datum ist z.B '2009-03-01' => '2008-02-29'
SET dtNewDate = DATE_SUB(dtDatum, INTERVAL 1 YEAR);
SET dtNewDate29 = DATE_SUB(dtNewDate, INTERVAL 1 DAY);
SET sDatum29 = DATE_FORMAT(dtNewDate29, '%Y-%m-%d');
IF (substr(sDatum29,6,5) = '02-29') THEN
SET dtNewDate = dtNewDate29;
END IF;
ELSE
SET dtNewDate = DATE_SUB(dtDatum, INTERVAL 1 YEAR);
END IF;
SET sDatum = DATE_FORMAT(dtNewDate, '%m-%d');
RETURN(sDatum);
END$$
DELIMITER ;
Code: SELECT 1, id, name, gebtag, BirthdayCheckLeapYear(gebtag)
FROM geburtstag
WHERE gebtag < CURRENT_DATE()
AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear('2010-03-01')
UNION ALL
SELECT 2, id, name, gebtag, BirthdayCheckLeapYear(gebtag)
FROM geburtstag
WHERE gebtag < CURRENT_DATE()
AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear('2010-01-01')
ORDER BY 1, 5
LIMIT 5;
+---+----+---------+------------+-------------------------------+
| 1 | id | name | gebtag | BirthdayCheckLeapYear(gebtag) |
+---+----+---------+------------+-------------------------------+
| 1 | 6 | Fritz-6 | 2007-03-01 | 03-01 |
| 1 | 1 | Fritz-1 | 2004-02-29 | 03-01 |
| 1 | 2 | Fritz-2 | 2008-02-29 | 03-01 |
| 1 | 7 | Fritz-7 | 2007-04-01 | 04-01 |
| 1 | 8 | Fritz-8 | 2007-05-01 | 05-01 |
+---+----+---------+------------+-------------------------------+
5 rows in set (0.02 sec)
mysql>
Code: SELECT 1, id, name, gebtag, BirthdayCheckLeapYear(gebtag)
FROM geburtstag
WHERE gebtag < CURRENT_DATE()
AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear('2004-02-29')
UNION ALL
SELECT 2, id, name, gebtag, BirthdayCheckLeapYear(gebtag)
FROM geburtstag
WHERE gebtag < CURRENT_DATE()
AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear('2004-01-01')
ORDER BY 1, 5
LIMIT 5;
+---+----+---------+------------+-------------------------------+
| 1 | id | name | gebtag | BirthdayCheckLeapYear(gebtag) |
+---+----+---------+------------+-------------------------------+
| 1 | 6 | Fritz-6 | 2007-03-01 | 03-01 |
| 1 | 1 | Fritz-1 | 2004-02-29 | 03-01 |
| 1 | 2 | Fritz-2 | 2008-02-29 | 03-01 |
| 1 | 7 | Fritz-7 | 2007-04-01 | 04-01 |
| 1 | 8 | Fritz-8 | 2007-05-01 | 05-01 |
+---+----+---------+------------+-------------------------------+
5 rows in set (0.02 sec)
-- Test für den 31.12 Code: SELECT 1, id, name, gebtag, BirthdayCheckLeapYear(gebtag)
FROM geburtstag
WHERE gebtag < CURRENT_DATE()
AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear('2008-12-31')
UNION ALL
SELECT 2, id, name, gebtag, BirthdayCheckLeapYear(gebtag)
FROM geburtstag
WHERE gebtag < CURRENT_DATE()
AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear('2008-01-01')
ORDER BY 1, 5
LIMIT 5;
+---+----+---------+------------+-------------------------------+
| 1 | id | name | gebtag | BirthdayCheckLeapYear(gebtag) |
+---+----+---------+------------+-------------------------------+
| 1 | 4 | Fritz-4 | 2004-12-31 | 12-31 |
| 2 | 3 | Fritz-3 | 2005-01-01 | 01-01 |
| 2 | 5 | Fritz-5 | 2007-02-01 | 02-01 |
| 2 | 2 | Fritz-2 | 2008-02-29 | 03-01 |
| 2 | 6 | Fritz-6 | 2007-03-01 | 03-01 |
+---+----+---------+------------+-------------------------------+
5 rows in set (0.01 sec)
Code: SELECT 1, id, name, gebtag, BirthdayCheckLeapYear(gebtag) FROM geburtstag WHERE gebtag < CURRENT_DATE() AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear(CURRENT_DATE()) UNION ALL SELECT 2, id, name, gebtag, BirthdayCheckLeapYear(gebtag) FROM geburtstag WHERE gebtag < CURRENT_DATE() AND BirthdayCheckLeapYear(gebtag) >= BirthdayCheckLeapYear(CONCAT(year(current_date), '-01-01')) ORDER BY 1, 5 LIMIT 5; +---+----+----------+------------+-------------------------------+ | 1 | id | name | gebtag | BirthdayCheckLeapYear(gebtag) | +---+----+----------+------------+-------------------------------+ | 1 | 9 | Fritz-9 | 2007-06-01 | 06-01 | | 1 | 10 | Fritz-10 | 2007-07-01 | 07-01 | | 1 | 11 | Fritz-11 | 2007-08-01 | 08-01 | | 1 | 12 | Fritz-12 | 2007-09-01 | 09-01 | | 1 | 4 | Fritz-4 | 2004-12-31 | 12-31 | +---+----+----------+------------+-------------------------------+ 5 rows in set (0.00 sec) Grüße Thomas |
|
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Erledigt] Vars in Datenbank und wieder auslesen | SteiniKeule | PHP Tipps 2010 | 3 | 03.04.2010 17:41 |
| xyz aus function("xyz"); in Datenbank auslesen?! | Nightuser | PHP Tipps 2008 | 5 | 14.07.2008 05:45 |
| prob mit datenbank auslesen ... | counteam | PHP Tipps 2008 | 22 | 06.07.2008 21:28 |
| [Erledigt] Datenbank und Ordner auslesen funzt net | borsty | PHP Tipps 2008 | 6 | 03.06.2008 13:56 |
| Nächste Geburtstage auslesen am Jahresende | MaMo-Net | Datenbanken | 9 | 15.08.2007 21:49 |
| [Erledigt] Datenbank auslesen mit register_globals off | PHP Tipps 2007 | 14 | 03.01.2007 17:12 | |
| beim auslesen von mysql datenbank bestimmte id nicht auslsen | djrace | PHP Tipps 2005-2 | 3 | 10.09.2005 13:32 |
| [Erledigt] Daten aus einer Datenbank auslesen | Datenbanken | 2 | 04.09.2005 19:13 | |
| Daten aus Datenbank per Zufall auslesen | elena | PHP Tipps 2005-2 | 2 | 06.07.2005 21:55 |
| Auslesen aus der Datenbank | nixdorf | PHP Tipps 2005 | 7 | 06.02.2005 21:40 |
| word/ pdf document aus datenbank auslesen?? | PHP Tipps 2005 | 3 | 03.02.2005 15:24 | |
| [Erledigt] Nur bestimmte Daten auslesen und in Datenbank schreiben | PHP Tipps 2004 | 2 | 26.09.2004 14:33 | |
| [Erledigt] meta refresh beim auslesen aus einer Datenbank umgehen | Datenbanken | 1 | 14.09.2004 20:10 | |
| Daten aus Datenbank auslesen | Datenbanken | 2 | 01.09.2004 01:58 | |
| ein feld aus datenbank auslesen ohne while | PHP Tipps 2004 | 6 | 10.06.2004 15:58 | |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php geburtstagsliste, http://www.php.de/datenbanken/67946-naechste-geburtstage-aus-datenbank-auslesen.html, geburtstagsliste, html, mysql nächster geburtstag, mysql geburtstag auslesen, html geburtstagsliste, mysql nächste geburtstage auslesen, geburtstagsliste php, sql create function nächsten geburtstag ausgeben, sql geburtstag, sql nächster geburtstag, geburtstagsliste html, mysql date nächste 5 geburtstage, geburtstagsliste in html, geburtstag aus datenbank auslesen in sql, geburtstag aus datenbank mit php, geburtstag per php auslesen, mysql date_format sortier problem jahreswechsel, geburtstag auslesen php, geburtsdatum aus datenbank auslesen |