我正在设置一个每天运行的脚本并检查符合特定年龄的成员 - 可以在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;
}
答案 0 :(得分:4)
答案 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...
部分。