Как я могу отфильтровать коллекцию на основе дня (а не даты)?

Конечной целью здесь является получение списка клиентов, чей день рождения сегодня, и отправка им кода ваучера (что также делается программно).

Для этого мне нужно собрать всех клиентов с днем ​​рождения сегодня. В SQL я бы преобразовал date в день и месяц и запросить это, но я не уверен, как это сделать в коллекции. В настоящее время у меня есть:

$collection = Mage::getResourceModel('customer/customer_collection')
->joinAttribute('dob','customer/dob', 'entity_id');
->addAttributeToFilter('dob', '2015-10-02 00:00:00');

Это подходит только для людей с DOB 2/10/2015. В этом примере мне нужно сопоставить всех с датой рождения 2 октября, а не только 2 октября 2015 года. Итак, как я могу опустить год и просто включить день и месяц?

Я смог добиться этого с помощью LIKE, но это кажется неоптимизированным, и я хотел бы предположить, что есть гораздо лучший способ сделать это:

$collection = Mage::getResourceModel('customer/customer_collection')
->joinAttribute('dob','customer/dob', 'entity_id')
->addAttributeToFilter('dob', array('like' => '%-10-02 00:00:00'));

4

Решение

Простое решение было бы, как этот запрос реализации в соответствии с вашей логикой потребности здесь:

SELECT
emp_firstname AS first_name,
emp_lastname AS last_name,
emp_birthday AS dob
FROM
emp
WHERE
MONTH(emp_birthday)=MONTH(CURDATE())
AND DAY(emp_birthday)=DAY(CURDATE())
or if you want to consider also leap years, you could use this:

SELECT
emp_firstname AS first_name,
emp_lastname AS last_name,
emp_birthday AS dob
FROM
emp
WHERE
emp_birthday +
INTERVAL
YEAR(CURDATE())-YEAR(emp_birthday) +
(MONTH(emp_birthday)<MONTH(CURDATE())
OR (MONTH(emp_birthday)=MONTH(CURDATE()) AND DAY(emp_birthday)<DAY(CURDATE())))
YEAR = CURDATE()
If someone's date of birth is on 29th of February, and today is 28th of February and this year is not a leap year, my last query will consider his/her birthday as today.

My second query could be also simplified like this:

SELECT
emp_firstname AS first_name,
emp_lastname AS last_name,
emp_birthday AS dob
FROM
emp
WHERE
(MONTH(emp_birthday)=MONTH(CURDATE())
AND DAY(emp_birthday)=DAY(CURDATE()))
OR (DAY(LAST_DAY(emp_birthday))=29
AND DAY(emp_birthday)=29
AND DAY(LAST_DAY(CURDATE()))=28);
0

Другие решения

solution:


require_once '../app/Mage.php';
Mage::app();

$currentDate = date('Y-m-d H:i:s');
$customerCollection = Mage::getResourceModel('customer/customer_collection')
->addNameToSelect()
->addAttributeToSelect('*')
->addAttributeToFilter('dob', array('lteq' => $currentDate));


foreach ($customerCollection as $customer) {
$active = $customer->getIsActive();
if($active == 1){
//echo 'customer Dob => '.$customer->getDob().'<br>';
$customerDob = $customer->getDob();
$customerId = $customer->getId();
$date =  date('d/m',  strtotime($customerDob));
echo $customerId.' => '.$date.'<br>';
}

}
0

По вопросам рекламы [email protected]