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

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

Комментарии: 9

Сергей Шлоков
21 августа 2016, 11:06
2
+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>`
]]
    nweb
    21 августа 2016, 15:05
    0
    Спасибо, работает.
    P.S. Надо бы MySQL подучить, а то начал городить какой-то велосипед со сниппетами…
      Андрей П
      06 января 2017, 18:35
      0
      Сергей, не могли бы Вы поделиться решением, работающим с датами и до 1970 года, чтобы огород не городить? Такая же проблема, как и у вопросителя
      Даты до 1970 года показывались отрицательным timestamp
        Сергей Шлоков
        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
          Сергей Шлоков
          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"]`
            Андрей П
            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"]'
      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;
        Дмитрий Иванов
        04 января 2017, 21:40
        +1
        Выбирать всех юзеров и прогонять их через проверки — не очень правильное решение, может быть очень медленно, если много юзеров. Лучше попытаться составить правильный запрос в базу.
          nweb
          07 января 2017, 18:39
          0
          Согласен. Сделал, как написано выше. Выигрыш в скорости очевиден:

          0.0062160: Total time
          0.7971439: Total time
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9