Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL日期比较建议_Php_Mysql_Datetime - Fatal编程技术网

Php MySQL日期比较建议

Php MySQL日期比较建议,php,mysql,datetime,Php,Mysql,Datetime,我正在设置一个脚本,每天运行,并检查符合特定年龄的成员-可以在CMS中设置自动电子邮件,并指定在任何年龄发送,无论是在几个月还是几年内。为了通过PHP和MySQL处理这个问题,月数作为一个参数传递给一个方法,如下所述。然而,我不确定我是否会用最简单的方式来做这件事!部分原因在于英国日期格式的格式,我将从字符串转换为datetime,再转换为unix时间戳来进行比较。 有人能找到更好的方法吗?谢谢 // If num of months provided is a year, ma

我正在设置一个脚本,每天运行,并检查符合特定年龄的成员-可以在CMS中设置自动电子邮件,并指定在任何年龄发送,无论是在几个月还是几年内。为了通过PHP和MySQL处理这个问题,月数作为一个参数传递给一个方法,如下所述。然而,我不确定我是否会用最简单的方式来做这件事!部分原因在于英国日期格式的格式,我将从字符串转换为datetime,再转换为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;
        }   
  • 将该列更改为date或datetime类型
  • 不要使用英国日期格式,请使用英国日期格式
  • 并在该列上建立索引
      • 将该列更改为date或datetime类型
      • 不要使用英国日期格式,请使用英国日期格式
      • 并在该列上建立索引

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

      SELECT whatever FROM users WHERE dob LIKE DATE_FORMAT(CURDATE(), '%d/%m/%%');
      
      这将采用当前日期,将其格式化为英国日期(将%%转换为单个%)。因此,对于今天(正如我所发布的),这将是“20/12/%”。它用这句话来表达对dob的喜爱,给每个人一个“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岁的人。。。几个月前,它不会起作用。如果是那样的话,我会选择你现在拥有的东西。这并不理想,但它或多或少会起作用,结果可能对您来说足够接近。

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

      SELECT whatever FROM users WHERE dob LIKE DATE_FORMAT(CURDATE(), '%d/%m/%%');
      
      这将采用当前日期,将其格式化为英国日期(将%%转换为单个%)。因此,对于今天(正如我所发布的),这将是“20/12/%”。它用这句话来表达对dob的喜爱,给每个人一个“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岁的人。。。几个月前,它不会起作用。如果是那样的话,我会选择你现在拥有的东西。这并不理想,但它或多或少会起作用,结果可能对您来说足够接近。

      datediff(now(),dob)
      将为您提供两个日期之间的天数差

      如果您想查看某人是否至少18岁,请尝试
      If(date\u sub(now(),18岁)>dob)

      每个人都是二月出生的<代码>如果(月(dob)=2)

      编辑:由于深不可测的原因,你不得不使用一个显示日期格式不正确的数据库,用你的
      STR\u TO\u date(dob…
      部分)替换dob。

      datediff(now(),dob)
      将给出两个日期之间的天数差

      如果您想查看某人是否至少18岁,请尝试
      If(date\u sub(now(),18岁)>dob)

      每个人都在二月出生吗?
      if(月(出生日期)=2)


      编辑:由于难以理解的原因,你不得不使用一个数据库来显示一个不是日期格式的日期,用你的
      STR_TO_日期替换dob(dob…
      部分。

      嗨,我被英国格式卡住了,不幸的是,这是一个我需要使用的现有数据库-我通常会使用UNIX时间戳进行数据存储。嗨,我被英国格式卡住了,不幸的是,这是一个我需要使用的现有数据库-我通常会使用UNIX时间戳进行数据存储。别傻了,s以正确的格式存储日期。这是您必须首先做的。请参阅下面的注释,我一直使用的日期存储格式。别傻了,以正确的格式存储日期。这是您必须首先做的。请参阅下面的注释,我一直使用的日期存储格式