При помощи ИИ переписал код с применением полей "Дата с календарём" и "MySQL Формула", теперь код умеет рассчитывать и отображать дату следующего дня рождения с правильным возрастом и склонением.
Возможности:
1. Определяет дату следующего дня рождения:
- Если день рождения в этом году
ещё не наступил → показывает дату в
текущем году
- Если день рождения в этом году
уже прошёл → показывает дату в
следующем году
2. Считает правильный возраст на эту дату:
- Для современных дат (после 1970 года)
- Для старых дат (до 1970 года) — например, 1959, 1945, 1930
- Учитывает, прошёл уже день рождения в этом году или нет
Пример 1 (день рождения ещё не наступил):
- Сегодня: 16.05.2026
- Дата рождения: 11.06.1990 → Покажет 11.06.2026 - 36 лет (а не 35)
Пример 2 (день рождения уже прошёл в этом году):
- Сегодня: 16.05.2026
- Дата рождения: 29.04.1959 - день рождения уже настал (был в апреле 2026) → Следующий день рождения: 29.04.2027 - 68 лет (а не 67)
3. Правильно склоняет слово "год":
- 1 год, 21 год, 101 год ....
- 2 года, 23 года, 34 года, 102 года ....
- 5 лет, 11 лет, 16 лет, 25 лет, 30 лет, 47 лет, 50 лет ....
Настройка:
1. Создать в Сущности поля с типом: "Дата с календарём" и "MySQL Формула"
2. В поле "Дата с календарём" вносится дата рождения
3. В поле "MySQL Формула" вносится следующий код:
Код: Выделить всё
IF([809] IS NOT NULL AND [809] != 0 AND [809] != '',
CONCAT(
FROM_UNIXTIME(
IF([809]>=0,
IF(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'), '%m%d') <= DATE_FORMAT(CURDATE(), '%m%d'),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE)+1,'-%m-%d'))),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d')))
),
IF(DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [809] SECOND), '%m%d') <= DATE_FORMAT(CURDATE(), '%m%d'),
UNIX_TIMESTAMP(CONCAT(YEAR(CURDATE())+1,'-',DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval [809] second), '%m-%d'))),
UNIX_TIMESTAMP(CONCAT(YEAR(CURDATE()),'-',DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval [809] second), '%m-%d')))
)
)
, '%d.%m.%Y'),
' (',
CASE
WHEN [809] >= 0 THEN
YEAR(FROM_UNIXTIME(
IF(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'), '%m%d') <= DATE_FORMAT(CURDATE(), '%m%d'),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE)+1,'-%m-%d'))),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d')))
)
)) - YEAR(FROM_UNIXTIME([809]+3600))
ELSE
YEAR(CURDATE()) - YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [809] SECOND)) + 1
END,
CASE
WHEN (CASE
WHEN [809] >= 0 THEN
YEAR(FROM_UNIXTIME(
IF(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'), '%m%d') <= DATE_FORMAT(CURDATE(), '%m%d'),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE)+1,'-%m-%d'))),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d')))
)
)) - YEAR(FROM_UNIXTIME([809]+3600))
ELSE
YEAR(CURDATE()) - YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [809] SECOND)) + 1
END) % 10 = 1
AND (CASE
WHEN [809] >= 0 THEN
YEAR(FROM_UNIXTIME(
IF(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'), '%m%d') <= DATE_FORMAT(CURDATE(), '%m%d'),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE)+1,'-%m-%d'))),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d')))
)
)) - YEAR(FROM_UNIXTIME([809]+3600))
ELSE
YEAR(CURDATE()) - YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [809] SECOND)) + 1
END) % 100 != 11 THEN ' год'
WHEN (CASE
WHEN [809] >= 0 THEN
YEAR(FROM_UNIXTIME(
IF(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'), '%m%d') <= DATE_FORMAT(CURDATE(), '%m%d'),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE)+1,'-%m-%d'))),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d')))
)
)) - YEAR(FROM_UNIXTIME([809]+3600))
ELSE
YEAR(CURDATE()) - YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [809] SECOND)) + 1
END) % 10 IN (2,3,4)
AND (CASE
WHEN [809] >= 0 THEN
YEAR(FROM_UNIXTIME(
IF(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'), '%m%d') <= DATE_FORMAT(CURDATE(), '%m%d'),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE)+1,'-%m-%d'))),
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([809]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d')))
)
)) - YEAR(FROM_UNIXTIME([809]+3600))
ELSE
YEAR(CURDATE()) - YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [809] SECOND)) + 1
END) % 100 NOT IN (12,13,14) THEN ' года'
ELSE ' лет'
END,
')'
),
''
)
4. id
[809] нужно заменить на своё
Остался вопрос, как полученные данные из "MySQL Формула" отобразить в "Общем календаре?" или в "Сводном календаре", который отображает данные только с датой?