Улучшение запроса для выбора дат (рождения), которые находятся в течение x дней с этого момента (в будущем и в прошлом) - PullRequest
0 голосов
/ 22 марта 2012

У меня есть таблица пользователей с полем birthday (ДАТА).

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

SELECT * FROM users
WHERE 
    DATE_FORMAT(birthday, '1980-%m-%d')
        BETWEEN
        DATE_FORMAT(DATE_SUB(CURRENT_DATE(), INTERVAL 7 day), '1980-%m-%d')
        AND
        DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL 7 day), '1980-%m-%d')

Как видите, этот запрос не является наиболее упорядоченным, учитывая сравнение с использованием фабричного форматирования 1980-х годов.Кроме того, я считаю, что это не сможет правильно выбрать пользователей на день рождения в последнюю и первую неделю года.

Пока я вижу проблемы с этим, я изо всех сил пытаюсь найти, как подойти к этому.Что я могу сделать, чтобы улучшить этот запрос?

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Попробуйте этот фильтр -

WHERE
  birthday + INTERVAL EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM birthday) YEAR
  BETWEEN CURRENT_DATE() - INTERVAL 7 DAY AND CURRENT_DATE() + INTERVAL 7 DAY
1 голос
/ 22 марта 2012
$int_range = 7;

$int_start = strtotime("today -{$int_range} Days")
$arr_days = array();
for($i = 1; $i <= ($int_range * 2); $i++)
    $arr_days[] = "'".date('m-d', strtotime("+{$i} Days", $int_start))."'";

$str_days = implode(', ', $arr_days);

mysql_query("
SELECT * FROM users
WHERE DATE_FORMAT(birthday, '%m-%d') IN ({$str_days})
");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...