Description
Describe the bug
I have a member born on february 29 1964. This gives the following error in my postgres log.
2023-12-14 13:54:46.594 UTC [3554] ERROR: date/time field value out of range: "2023-02-29"
2023-12-14 13:54:46.594 UTC [3554] STATEMENT: SELECT DISTINCT usr_id, usr_uuid, usr_login_name,
last_name.usd_value AS last_name, first_name.usd_value AS first_name,
birthday.bday AS birthday, birthday.bdate,
EXTRACT(DAY FROM TO_TIMESTAMP($1, 'YYYY-MM-DD') - birthday.bdate) * (-1) AS days_to_bdate, -- DATE_NOW
EXTRACT(YEAR FROM bdate) - EXTRACT(YEAR FROM TO_TIMESTAMP(bday, 'YYYY-MM-DD')) AS age,
email.usd_value AS email, gender.usd_value AS gender
FROM adm_users AS users
INNER JOIN ( (SELECT usd_usr_id, usd_value AS bday,
TO_DATE(EXTRACT(YEAR FROM TO_TIMESTAMP($2, 'YYYY-MM-DD')) || TO_CHAR(TO_TIMESTAMP(bd1.usd_value, 'YYYY-MM-DD'), '-MM-DD'), 'YYYY-MM-DD') AS bdate -- DATE_NOW
FROM adm_user_data AS bd1
WHERE EXTRACT(DAY FROM TO_TIMESTAMP($3, 'YYYY-MM-DD') - TO_TIMESTAMP(EXTRACT(YEAR FROM TO_TIMESTAMP($4, 'YYYY-MM-DD')) || TO_CHAR(TO_TIMESTAMP(bd1.usd_value, 'YYYY-MM-DD'), '-MM-DD'), 'YYYY-MM-DD')) -- DATE_NOW,DATE_NOW
BETWEEN $5 AND $6 -- -$plg_show_zeitraum AND $plg_show_future
AND usd_usf_id = $7) -- $fieldBirthday
UNION
(SELECT usd_usr_id, usd_value AS bday,
TO_DATE(EXTRACT(YEAR FROM TO_TIMESTAMP($8, 'YYYY-MM-DD'))-1 || TO_CHAR(TO_TIMESTAMP(bd2.usd_value, 'YYYY-MM-DD'), '-MM-DD'), 'YYYY-MM-DD') AS bdate -- DATE_NOW
FROM adm_user_data AS bd2
WHERE EXTRACT(DAY FROM TO_TIMESTAMP($9, 'YYYY-MM-DD') - TO_TIMESTAMP(EXTRACT(YEAR FROM TO_TIMESTAMP($10, 'YYYY-MM-DD')- INTERVAL '1 year') || TO_CHAR(TO_TIMESTAMP(bd2.usd_value, 'YYYY-MM-DD'), '-MM-DD'), 'YYYY-MM-DD')) -- DATE_NOW,DATE_NOW
BETWEEN $11 AND $12 -- -$plg_show_zeitraum AND $plg_show_future
AND usd_usf_id = $13) -- $fieldBirthday
UNION
(SELECT usd_usr_id, usd_value AS bday,
TO_DATE(EXTRACT(YEAR FROM TO_TIMESTAMP($14, 'YYYY-MM-DD'))+1 || TO_CHAR(TO_TIMESTAMP(bd3.usd_value, 'YYYY-MM-DD'), '-MM-DD'), 'YYYY-MM-DD') AS bdate -- DATE_NOW
FROM adm_user_data AS bd3
WHERE EXTRACT(DAY FROM TO_TIMESTAMP($15, 'YYYY-MM-DD') - TO_TIMESTAMP(EXTRACT(YEAR FROM TO_TIMESTAMP($16, 'YYYY-MM-DD')+ INTERVAL '1 year') || TO_CHAR(TO_TIMESTAMP(bd3.usd_value, 'YYYY-MM-DD'), '-MM-DD'), 'YYYY-MM-DD')) -- DATE_NOW,DATE_NOW
BETWEEN $17 AND $18 -- -$plg_show_zeitraum AND $plg_show_future
AND usd_usf_id = $19) -- $fieldBirthday
) AS birthday
ON birthday.usd_usr_id = usr_id
LEFT JOIN adm_user_data AS last_name
ON last_name.usd_usr_id = usr_id
AND last_name.usd_usf_id = $20 -- $gProfileFields->getProperty('LAST_NAME', 'usf_id')
LEFT JOIN adm_user_data AS first_name
ON first_name.usd_usr_id = usr_id
AND first_name.usd_usf_id = $21 -- $gProfileFields->getProperty('FIRST_NAME', 'usf_id')
LEFT JOIN adm_user_data AS email
ON email.usd_usr_id = usr_id
AND email.usd_usf_id = $22 -- $gProfileFields->getProperty('EMAIL', 'usf_id')
LEFT JOIN adm_user_data AS gender
ON gender.usd_usr_id = usr_id
AND gender.usd_usf_id = $23 -- $gProfileFields->getProperty('GENDER', 'usf_id')
LEFT JOIN adm_members
ON mem_usr_id = usr_id
AND mem_begin <= $24 -- DATE_NOW
AND mem_end > $25 -- DATE_NOW
INNER JOIN adm_roles
ON mem_rol_id = rol_id
AND rol_valid = true
INNER JOIN adm_categories
ON rol_cat_id = cat_id
AND cat_org_id = $26 -- $gCurrentOrgId
WHERE usr_valid = true
AND mem_rol_id IS NOT NULL
ORDER BY days_to_bdate DESC, last_name, first_name
I can imagine this happens somewhere if the birthday date is not handled with database-functions when a year is added or substracted. The year today is no leap year and the 29 of february 2023 don't exist.
To Reproduce
Steps to reproduce the behavior:
- Go to Members
- Click on a member and change birthday to 29 february a leap year.
- save
- click on another member and change birthday to any year and current month and day
- go to overview and check birthday module
- no birthdays is shown
Expected behavior
You should see the member that you changed birthday to this month and day
System (please complete the following information):
- Admidio-Version Container with tag 4.2.14
- PHP n/a - in Container
- Database PostgreSQL
- Browser firefox
- Browser-Version 120.0.1