Вывод дня рождения пользователя Новый

Дополнение: pdoUsers

Задача: показать пользователей, у которых сегодня день рождения.
Понял как сделать выборку по конкретному дню.
[[!pdoUsers?
&where=`{"modUserProfile.dob":"714254400"}`
&tpl=`@INLINE <p>[[+fullname]] [[+dob]]</p>`
]]
А вот как решить свою задачу — не понял. dob отдает значение в timestamp, как же его «сравнить» с текущей датой?
20 августа 2016, 23:13    nweb   
3    518 +1

Комментарии (9)

  1. Сергей Шлоков 21 августа 2016, 11:06 # +2
    Как-то так
    [[!pdoUsers?
    	&where=`["DAYOFMONTH(FROM_UNIXTIME(modUserProfile.dob)) = DAYOFMONTH(now()) AND MONTH(FROM_UNIXTIME(modUserProfile.dob)) = MONTH(now())"]`
    	&tpl=`@INLINE <p>[[+fullname]] {{+dob:date=`%d.%m.%Y`}}</p>`
    ]]
    
    1. nweb 21 августа 2016, 15:05 # 0
      Спасибо, работает.
      P.S. Надо бы MySQL подучить, а то начал городить какой-то велосипед со сниппетами…
      1. Андрей П 06 января 2017, 18:35 # 0
        Сергей, не могли бы Вы поделиться решением, работающим с датами и до 1970 года, чтобы огород не городить? Такая же проблема, как и у вопросителя
        Даты до 1970 года показывались отрицательным timestamp
        1. Сергей Шлоков 06 января 2017, 19:42 # +2
          Решение, полученное самостоятельно на порядок ценнее, чем подсказанное. Попробуйте сами, а потом сравните с этим
          DAYOFMONTH(IF(modUserProfile.dob>0,FROM_UNIXTIME(modUserProfile.dob),ADDDATE('1970-01-01 00:00:00', INTERVAL modUserProfile.dob SECOND))) = DAYOFMONTH(now()) AND 
          MONTH(IF(modUserProfile.dob>0,FROM_UNIXTIME(modUserProfile.dob),ADDDATE('1970-01-01 00:00:00', INTERVAL modUserProfile.dob SECOND))) = MONTH(now()) and modUserProfile.dob <> 0
          
          1. Сергей Шлоков 06 января 2017, 21:24 # +3
            Можно короче
            &where=`["DAYOFMONTH(ADDDATE('1970-01-01 00:00:00', INTERVAL modUserProfile.dob SECOND)) = DAYOFMONTH(now()) AND 
            MONTH(ADDDATE('1970-01-01 00:00:00', INTERVAL modUserProfile.dob SECOND)) = MONTH(now()) and modUserProfile.dob <> 0"]`
            
            1. Андрей П 07 января 2017, 01:41 # +1
              Спасибо, вот рабочее решение
              'where'=>'["DAYOFMONTH(ADDDATE(FROM_UNIXTIME(0), INTERVAL modUserProfile.dob SECOND)) = DAYOFMONTH(now()) AND 
              MONTH(ADDDATE(FROM_UNIXTIME(0), INTERVAL modUserProfile.dob SECOND)) = MONTH(now()) and modUserProfile.dob <> 0"]'
      2. nweb 04 января 2017, 12:56 # 0
        Даты до 1970 года показывались отрицательным timestamp. В итоге сделал так:

        $snippet = $modx->runSnippet('pdoUsers', array(
            'users' => '-1',
            'tpl' => '@INLINE [[+username:if=`[[+dob:date=`%m`]]`:is=`[[!now_month]]`:and:if=`[[+dob:date=`%d`]]`:is=`[[!now_day]]`:then=`[[+fullname]], с днём рождения!`:else=``]]',
            'limit' => 'all'
            ));
        echo $snippet;
        

        now_day:
        <?php
        $day = date("d");
        return $day;
        

        now_month:
        <?php
        $month = date("m");
        return $month;
        
        1. Дмитрий Иванов 04 января 2017, 21:40 # +1
          Выбирать всех юзеров и прогонять их через проверки — не очень правильное решение, может быть очень медленно, если много юзеров. Лучше попытаться составить правильный запрос в базу.
          1. nweb 07 января 2017, 18:39 # 0
            Согласен. Сделал, как написано выше. Выигрыш в скорости очевиден:

            0.0062160: Total time
            0.7971439: Total time
        Вы должны авторизоваться, чтобы оставлять комментарии.