admidio
admidio copied to clipboard
Birthday module give database error when member/contact is born on 29 february
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