今日の日付の前後 3 日間の誕生日を持つユーザーのリストを取得したいと考えています。つまり、今日が の場合、誕生日がまでMarch 2,2013
のユーザーを取得したいということです。これが私のデータベース設計です。Feb 27,2013
March 5,2013
ユーザー テーブル
id | name | birth_day | birth_month | birth_year
データベースにアクセスできないため、データベースのデザインを変更することはできなくなりました。デザインの変更は、Web サイトの大幅な変更にのみ発生します。
これは私の現在のコードです:
if (empty($date))
$date = date('Y-m-d'); // now
$start_date = strtotime($date.' -'.$day_range.' day');
$end_date = strtotime($date.' +'.$day_range.' day');
$start_month = date('m', $start_date);
$end_month = date('m', $end_date);
$start_day = date('d', $start_date);
$end_day = date('d', $end_date);
if ($start_day > $end_day) {
$tmp = $start_day;
$start_day = $end_day;
$end_day = $tmp;
}
/* This is a dirty fix for getting birthdays between dates */
$this->User->contain(array('User' => array('first_name', 'last_name', 'userstatus_id')));
$user = $this->User->find('all', array(
'conditions' => array(
'User.birth_month BETWEEN ? AND ?' => array($start_month, $end_month),
'User.birth_day BETWEEN ? AND ?' => array($start_day, $end_day),
),
'fields' => array(
'birth_year',
'birth_day',
'birth_month'
),
'order' => array(
'birth_month' => 'ASC',
'birth_day' => 'ASC'
)
));
foreach($user as $k => $v) {
$temp = strtotime(date('Y-'.$user[$k]['User']['birth_month'].'-'.$user[$k]['User']['birth_day']));
if ($temp >= $start_date && $temp <= $end_date) {
}
else {
unset($user[$k]);
}
}