Ik wil met onderstaande query de verjaardagen van deze week halen, behalve vandaag. Maar helaas lukt het niet om de verjaardagen van vandaag over te slaan.
Weet iemand een manier? Die ook werk bij de schrikkeljaren en jaren voor 1970?
SELECT *,
DAYOFMONTH ( datum ) AS dag,
MONTH ( datum ) AS maand,
(YEAR( CURRENT_DATE( ) ) - YEAR(datum)) AS leeftijd
FROM `verjaardag`
WHERE
(
DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) )
AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) ) +7
)
OR
(
DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( datum ) -7
AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( datum )
)
ORDER BY maand, dag, leeftijd ASC
Ik zou deze code willen gebruiken om op mijn site de volgende wedstrijden aan te kondigen.
Ik zie het verband niet tussen verjaardagen en een wedstrijdprogramma.
Ik denk dat je beter een nieuw topic kan starten.
Daarnaast is de hier geboden oplossing niet correct.
WHERE CONCAT(YEAR(CURDATE()) , DATE_FORMAT(geboortedatum, '-%m-%d'))
BETWEEN DATE_ADD(CURDATE() , INTERVAL 1 DAY) AND DATE_ADD(CURDATE() , INTERVAL 8 DAY)
Dit zal van 24 t/m 31 december onjuiste resultaten opleveren, als bv op 30 december 2014 dit wordt uitgevoerd, krijgt iemand geboren op 1980-01-02 de datum 2014-01-02, hetgeen resulteert in
WHERE '2014-01-02' BETWEEN '2014-12-31' AND '2015-01-06'
De oplossing is om een serie met datums te generen en dan de tabel te joinen op maand-dag:
SELECT
u.first_name,
u.last_name,
d.ref_date,
TIMESTAMPDIFF(YEAR, u.birth_date, d.ref_date) age
FROM
(
SELECT
@ref_date := @ref_date + INTERVAL 1 DAY ref_date
FROM
(SELECT 1 x UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7) s
CROSS JOIN
(SELECT @ref_date := CURRENT_DATE) v
) d
JOIN
users u
ON DATE_FORMAT(d.ref_date, '%m-%d') = DATE_FORMAT(u.birth_date, '%m-%d')
Ik weet dat dit al een oud topic is, maar dit verjaart niet.