Дни рождения клиентов в календаре

Все вопросы/проблемы по установке и использовании.
alexinc
Сообщения: 422
Зарегистрирован: 03 мар 2022, 21:40
Имя: Alex
Откуда: Россия
Контактная информация:

Re: Дни рождения клиентов в календаре

Сообщение alexinc »

ivan32 писал(а): 09 авг 2023, 23:00
alexinc писал(а): 20 июн 2023, 17:25
alena писал(а): 15 июн 2023, 11:30

Попробовала - к сожалению, нет, при д.р. 02.04.1986 выдает 01.04.2023
пока пользуюсь методом "плюс час" - вроде работает)
Там еще одна засада есть - если день рождения человека старше 1970 года. UNIXTIME уходит в отрицательные значения и выражение не работает.


ROUND(
UNIX_TIMESTAMP(
CONCAT(
DATE_FORMAT(NOW(), '%Y-'),
DATE_FORMAT(FROM_UNIXTIME(0) + INTERVAL + ДатаРожденияЧеловека SECOND, "%m-%d")
)
)
)
Я под другому сделал:

Код: Выделить всё

if ([946]>=0,
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([946]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d'))), UNIX_TIMESTAMP(CONCAT(YEAR(CURDATE()),'-',DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval [946] second), '%m-%d'))) )
где 946 - поле с датой рождения.
Аватара пользователя
vgrachev
Сообщения: 172
Зарегистрирован: 22 фев 2022, 10:10
Имя: Валерий
Откуда: Ростов-на-Дону

Re: Дни рождения клиентов в календаре

Сообщение vgrachev »

alena писал(а): 07 июн 2023, 16:00
nruslan2 писал(а): 07 июн 2023, 15:56 на сервер лучше закачивать архив, и там его разархивировать!
я раньше так и делала, но сегодня обнаружила, что на таймвебе обновили файловый менеджер) он не распаковывает почему-то (((
Они вроде решают эту проблему, а для того что бы избежать проблем с этим пользуйтесь их же терминалом SSH:
Распаковать архив: public_html.zip для этого нужно перейти в директорию: cd ~/domain.ru и выполнить: unzip public_html.zip
Распакованная директория находится в этой же директории, под именем public_html!
А для создания архива, перейдите в нужную директорию при помощи cd и выполните:
zip public_html.zip -r ./public_html

П.С. имена файлов и домена используйте свои...
Lazutkin_Max
Сообщения: 57
Зарегистрирован: 13 июн 2023, 14:11
Имя: Максим Лазуткин
Откуда: Москва

Re: Дни рождения клиентов в календаре

Сообщение Lazutkin_Max »

support писал(а): 08 июн 2023, 06:20 Возможно в будущем для дня рождения создам отдельное поле со всякими там напоминаниями об этом важном дне:)))
Подскажите, пожалуйста, нет ли уже такого поля- "даты без года", хочу сделать "напоминатор" о днях рождения и других памятных датах. Чтобы приходили каждый год.
ivan32
Сообщения: 78
Зарегистрирован: 10 июн 2021, 15:41
Имя: ivan
Откуда: kamchatka

Re: Дни рождения клиентов в календаре

Сообщение ivan32 »

на несколько сообщений выше я написал решение данного вопроса. все работает, напоминает, а дальше уведомление себе на почту
Serdobolniy
Спонсор
Спонсор
Сообщения: 127
Зарегистрирован: 03 мар 2016, 23:01
Имя: Сергей

Re: Дни рождения клиентов в календаре

Сообщение Serdobolniy »

support писал(а): 08 июн 2023, 06:20 Возможно в будущем для дня рождения создам отдельное поле со всякими там напоминаниями об этом важном дне:)))
Добрый день, было бы интересно и актуально заполучить такое поле. Просто если в сущности "Пользователи" есть поле - "Фотография", почему бы не добавить ещё одно поле "День рождение" и привязать его к календарю? Готов поддержать рублём
Аватара пользователя
vgrachev
Сообщения: 172
Зарегистрирован: 22 фев 2022, 10:10
Имя: Валерий
Откуда: Ростов-на-Дону

Re: Дни рождения клиентов в календаре

Сообщение vgrachev »

Serdobolniy писал(а): 20 апр 2026, 11:26
support писал(а): 08 июн 2023, 06:20 Возможно в будущем для дня рождения создам отдельное поле со всякими там напоминаниями об этом важном дне:)))
Добрый день, было бы интересно и актуально заполучить такое поле. Просто если в сущности "Пользователи" есть поле - "Фотография", почему бы не добавить ещё одно поле "День рождение" и привязать его к календарю? Готов поддержать рублём
Да это можно сделать по сути и штатными средствами, поле дата и повесить уведомление...
Serdobolniy
Спонсор
Спонсор
Сообщения: 127
Зарегистрирован: 03 мар 2016, 23:01
Имя: Сергей

Re: Дни рождения клиентов в календаре

Сообщение Serdobolniy »

alexinc писал(а): 15 авг 2023, 23:57

Код: Выделить всё

if ([946]>=0,
UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME([946]+3600,'%Y-%m-%d'),CONCAT(YEAR(CURRENT_DATE),'-%m-%d'))), UNIX_TIMESTAMP(CONCAT(YEAR(CURDATE()),'-',DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval [946] second), '%m-%d'))) )
Спасибо, работает, если применять поля "Дата с календарём" и "Динамическая дата", только как добавить отображение информации в общедоступном календаре?

Добавил пользователю "Дату рождения", при помощи типа поля "Дата с календарём", и высчитал из поля "Отмечаем ДР" с типом "Динамическая дата" - показывает правильно, только не показывает в "Календаре" - не в "Сводном календаре" хочется видеть информацию.

Так же хочется видеть функционал "Календаря отпусков" и "Производственный календарь" в одном общем "Календаре"
Serdobolniy
Спонсор
Спонсор
Сообщения: 127
Зарегистрирован: 03 мар 2016, 23:01
Имя: Сергей

Re: Дни рождения клиентов в календаре

Сообщение Serdobolniy »

При помощи ИИ переписал код с применением полей "Дата с календарём" и "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] нужно заменить на своё
Снимок экрана (168).png
Остался вопрос, как полученные данные из "MySQL Формула" отобразить в "Общем календаре?" или в "Сводном календаре", который отображает данные только с датой?
Аватара пользователя
Fait
Инвестор
Инвестор
Сообщения: 1196
Зарегистрирован: 19 ноя 2020, 17:46
Имя: Максим Балакшеев
Откуда: Россия, Златоуст
Организация: ИП Балакшеев Максим Георгиевич
Контактная информация:

Re: Дни рождения клиентов в календаре

Сообщение Fait »

Позвольте вставлю свои 5 копеек...
Я использую такой код для поля с типом "Динамическая дата", с помощью которого как раз таки и можно будет отображать записи в сводном календаре.

Код: Выделить всё

IF([777]=0,'',
  IF(
    [TODAY] > UNIX_TIMESTAMP(CONCAT(
      YEAR(FROM_UNIXTIME([TODAY],'%Y-%m-%d')),'-',
      MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)),'-',
      CASE
        WHEN MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)) = 2
         AND DAY(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)) = 29
         AND DAY(LAST_DAY(CONCAT(YEAR(FROM_UNIXTIME([TODAY],'%Y-%m-%d')),'-02-01'))) = 28
        THEN 28
        ELSE DAY(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND))
      END
    )),

    UNIX_TIMESTAMP(CONCAT(
      YEAR(FROM_UNIXTIME([TODAY],'%Y-%m-%d'))+1,'-',
      MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)),'-',
      CASE
        WHEN MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)) = 2
         AND DAY(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)) = 29
         AND DAY(LAST_DAY(CONCAT(YEAR(FROM_UNIXTIME([TODAY],'%Y-%m-%d'))+1,'-02-01'))) = 28
        THEN 28
        ELSE DAY(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND))
      END
    )),

    UNIX_TIMESTAMP(CONCAT(
      YEAR(FROM_UNIXTIME([TODAY],'%Y-%m-%d')),'-',
      MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)),'-',
      CASE
        WHEN MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)) = 2
         AND DAY(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND)) = 29
         AND DAY(LAST_DAY(CONCAT(YEAR(FROM_UNIXTIME([TODAY],'%Y-%m-%d')),'-02-01'))) = 28
        THEN 28
        ELSE DAY(DATE_ADD(FROM_UNIXTIME(0), INTERVAL ([777]+83200) SECOND))
      END
    ))
  )
)
В коде замените все [777] на свой ID поля с датой рождения.

Код позволяет получить следующий день рождения, учитывая 28/29 февраля, даты вне UNIX формата (раньше 01.01.1970 и позже 19.01.2038).
Короче говоря, формат универсальный, пользуйтесь ;) .
Serdobolniy писал(а): 16 май 2026, 17:55 Остался вопрос, как полученные данные из "MySQL Формула" отобразить в "Общем календаре?" или в "Сводном календаре", который отображает данные только с датой?
В общем (публичном) календаре свой мир. В нём вы никакие данные из сущностей отобразить не сможете штатными средствами.


Также хочу предостеречь, что если записей с днями рождения будет пара тысяч, или вам вдруг захочется вывести поле с днём рождения в список записей, то приготовьтесь к тормозам...
Serdobolniy
Спонсор
Спонсор
Сообщения: 127
Зарегистрирован: 03 мар 2016, 23:01
Имя: Сергей

Re: Дни рождения клиентов в календаре

Сообщение Serdobolniy »

Fait писал(а): 16 май 2026, 23:58 Я использую такой код для поля с типом "Динамическая дата", с помощью которого как раз таки и можно будет отображать записи в сводном календаре.
Добрый день, спасибо, с "Динамической датой" работает и отображается в "Сводном календаре"
Ответить