【问题标题】:MySQL Date comparison adviceMySQL 日期比较建议
【发布时间】:2023-03-20 22:37:01
【问题描述】:

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

【问题讨论】:

  • 别傻了,以正确的格式存储日期。这是你首先要做的。
  • 见下面的评论,我在这里卡住的日期存储格式

标签: php mysql datetime


【解决方案1】:
  • 将该列更改为键入日期或日期时间
  • 不要使用英国日期格式,使用ISO-8601 格式
  • 并在该列上建立索引

【讨论】:

  • 嗨,很遗憾,我坚持使用英国格式,因为它是我需要使用的现有数据库 - 我通常会使用 UNIX 时间戳进行数据存储。
【解决方案2】:

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

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

这将采用当前日期,将其格式化为英国日期(%% 变为单个 %)。所以对于今天(正如我发布的),那将是“20/12/%”。它将它用于一个 LIKE on 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... 个月前的人,这是行不通的。在那种情况下,我实际上会选择你所拥有的东西。这并不理想,但它或多或少会起作用,并且结果可能对您来说足够接近。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2011-04-10
      • 2011-07-10
      相关资源
      最近更新 更多