MySQL Date сравнительный совет - PullRequest
1 голос
/ 20 декабря 2010

Я настраиваю скрипт для ежедневного запуска и проверяю участников, которые соответствуют определенному возрасту - автоматические электронные письма могут быть настроены в CMS и назначены для отправки в любом возрасте, в месяцах или годах. Чтобы справиться с этим через PHP и MySQL, число месяцев передается в качестве параметра методу, который я рассмотрю, как показано ниже. Тем не менее, я не уверен, что я пойду об этом самым простым способом! Частично из-за форматирования британского формата даты, я преобразую строку в дату и время в метку времени Unix, чтобы сделать сравнение. Может кто-нибудь найти лучший способ пойти по этому поводу? Спасибо

        // If num of months provided is a year, make calculation based on exact year
        if ($age_in_months % 12 == 0)
        {
            // Using 365 days here (60 * 60 * 24 * 365 = 3153600)
            $clause = 'WHERE ROUND((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(STR_TO_DATE(dob, "%d/%m/%Y"))) / 31536000) = ' . $age_in_months;
        }
        else 
        {
            // Using 30 days as avg month length (60 * 60 * 24 = 86400) - convert months to days
            $clause = 'WHERE ROUND((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(STR_TO_DATE(dob, "%d/%m/%Y"))) / 86400) = ' . $age_in_months * 30;
        }   

Ответы [ 3 ]

4 голосов
/ 20 декабря 2010
  • изменить этот столбец, чтобы ввести дату или дату и время
  • не используйте британский формат даты, используйте ISO-8601 формат
  • и индекс в этом столбце
0 голосов
/ 20 декабря 2010

datediff(now(),dob) даст вам разницу в днях между двумя датами.

Если вы хотите узнать, кому по крайней мере 18 лет, попробуйте if (date_sub(now(),18 years) > dob)

Все, кто родился в феврале? if (month(dob) = 2)

См. http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Редактировать: и, поскольку вы застряли (по непостижимым причинам) в базе данных, показывающей дату, которая не в формате даты, замените dob на раздел STR_TO_DATE(dob....

0 голосов
/ 20 декабря 2010

Я бы просто использовал логику даты MySQL.Вы можете быть хитрым и использовать тот факт, что столбец DOB хранится в виде текста, вот так:

SELECT whatever FROM users WHERE dob LIKE DATE_FORMAT(CURDATE(), '%d/%m/%%');

Это будет принимать текущую дату, отформатировать ее как дату в Великобритании (%% превращается в единый%).Так что на сегодня (как я пишу), это будет «20/12 /%».Он использует это для LIKE на dob, давая вам всех с днем ​​рождения '20 /12/(something)'.

Это немного странно, но на самом деле используется преимущество сохранения DOB в тексте.формат.Я предполагаю индекс DOB, хотя вы могли бы обойтись без него, если у вас не слишком много людей.

Для второго запроса, похоже, вы пытаетесь сделать «Люди, которыеродились 6 месяцев назад 'типа вещь.Это правильно?Вы могли бы примерно так:

SELECT whatever FROM users WHERE DATE_ADD(CURDATE(), INTERVAL -6 MONTH) = STR_TO_DATE(dob, '%d/%m/%Y');

Это не красиво, и если вы хотите, чтобы люди, которые родились 6, 18, 30 ... месяцев назад, это не сработает.В этом случае, я бы на самом деле пошел с чем-то вроде того, что у вас есть.Это не идеально, но это более или менее сработает, и результаты могут быть достаточно близки для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...