MySQL日期比较建议

时间:2010-12-20 18:40:47

标签: php mysql datetime

我正在设置一个每天运行的脚本并检查符合特定年龄的成员 - 可以在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 个答案:

答案 0 :(得分:4)

  • 将该列更改为键入日期或日期时间
  • 请勿使用英国日期格式,请使用ISO-8601格式
  • 和该列的索引

答案 1 :(得分:0)

我只是使用MySQL日期逻辑。您可以偷偷摸摸地使用DOB列存储为文本的事实,这就是:

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

这将采用当前日期,将其格式化为英国日期(%%变为单个%)。所以对于今天(我发布),那将是'20 / 12 /%'。它在dob上用于LIKE,给你每个人生日'20 / 12 /(某事)'。

这有点奇怪,但它实际上利用了以文本格式存储DOB。我假设DOB上有一个索引,但如果没有太多人,你可以在没有它的情况下离开。

对于第二个查询,看起来你正在尝试做一个“6个月前出生的人”类型的事情。是对的吗?你可以这样:

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

这不是一个漂亮的,如果你想要6个月,18个月,30个月前出生的人就行不通。在那种情况下,我实际上会使用你拥有的东西。它并不理想,但它会或多或少地起作用,结果可能足够接近你。

答案 2 :(得分:0)

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...部分。