Вывод дня рождения пользователя
Задача: показать пользователей, у которых сегодня день рождения.
Понял как сделать выборку по конкретному дню.
Понял как сделать выборку по конкретному дню.
[[!pdoUsers?
&where=`{"modUserProfile.dob":"714254400"}`
&tpl=`@INLINE <p>[[+fullname]] [[+dob]]</p>`
]]
А вот как решить свою задачу — не понял. dob отдает значение в timestamp, как же его «сравнить» с текущей датой? Комментарии: 9
Как-то так
[[!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>`
]]
Спасибо, работает.
P.S. Надо бы MySQL подучить, а то начал городить какой-то велосипед со сниппетами…
P.S. Надо бы MySQL подучить, а то начал городить какой-то велосипед со сниппетами…
Сергей, не могли бы Вы поделиться решением, работающим с датами и до 1970 года, чтобы огород не городить? Такая же проблема, как и у вопросителя
Даты до 1970 года показывались отрицательным timestamp
Решение, полученное самостоятельно на порядок ценнее, чем подсказанное. Попробуйте сами, а потом сравните с этим
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
Можно короче
&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"]`
Спасибо, вот рабочее решение
'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"]'
Даты до 1970 года показывались отрицательным timestamp. В итоге сделал так:
now_day:
now_month:
$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;
Выбирать всех юзеров и прогонять их через проверки — не очень правильное решение, может быть очень медленно, если много юзеров. Лучше попытаться составить правильный запрос в базу.
Согласен. Сделал, как написано выше. Выигрыш в скорости очевиден:
0.0062160: Total time
0.7971439: Total time
0.0062160: Total time
0.7971439: Total time
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.