【问题标题】:Compare two dates using php and mysql database使用 php 和 mysql 数据库比较两个日期
【发布时间】:2013-10-29 03:46:29
【问题描述】:

我正在尝试将日期与 MySQL 数据库中的日期进行比较,该日期距当前日期大于 90、60、30 天。我正在使用 DateTime 对象,它很容易操作,但我在获取我正在寻找的响应时遇到了问题。非常感谢任何帮助。

<?php
//date_default_timezone_set('America/Chicago');
$todaysDate = new DateTime('now');
$formattedDate = $todaysDate->format('Y-m-d');

$date = new DateTime ('now');
$date90 = $date->add(new DateInterval('P90D'));
$date90 = $date->format('Y-m-d');

$date = new DateTime ('now');
$date60 = $date->add(new DateInterval('P60D'));
$date60 = $date->format('Y-m-d');

$date = new DateTime ('now');
$date30 = $date->add(new DateInterval('P30D'));
$date30 = $date->format('Y-m-d');

//echo $date90;
//echo "<br />";
//echo $formattedDate;

$thirtyDays = array();
$sixtyDays = array();
$ninetyDays = array();


$sql = "SELECT * FROM service;";

if(!$result = $con->query($sql)){
die('There was an error running the query [' . $con->error . ']');  
}else{              
    //$numRows = $result->num_rows;
    while($row = $result->fetch_array()){
        $boosterDate = $row['boosterDate'];

    }

}

if($boosterDate > $date90){
    echo "greater than 90 days";
    echo "<br />";


}               

?>

【问题讨论】:

    标签: php mysql sql date datetime


    【解决方案1】:

    我假设您正在为 boosterDate

    使用 Mysql 日期类型字段

    检查你的mysql数据库时区

    SELECT @@global.time_zone, @@session.time_zone;
    

    检查你的 php 时区

    date_default_timezone_get
    

    确保它们匹配,如果不匹配则调整

    【讨论】:

    • DATETIME 列不会被 MySQL 时区逻辑转换,只有 TIMESTAMP 列。 DATETIME 列是非时区感知文字。
    • @Michael-sqlbot 他们可能在错误的时区期间。最好将所有数据存储为 UTC 并根据需要进行转换,但不是每个人都这样做。
    • MySQL 数据库为系统,php 时区为 UTC。
    【解决方案2】:

    不确定这是否是您想要的解决方法,但我不喜欢在数据库处理得如此顺利时在应用程序中进行日期修改...您可以在 SQL 中完成所有事情。

    SELECT s.*,
      CASE WHEN DATE(boosterDate) > DATE_ADD(DATE(NOW()),INTERVAL 90 DAY) THEN 90
           WHEN DATE(boosterDate) > DATE_ADD(DATE(NOW()),INTERVAL 60 DAY) THEN 60
           WHEN DATE(boosterDate) > DATE_ADD(DATE(NOW()),INTERVAL 30 DAY) THEN 30
           ELSE NULL END AS date_range_test
      FROM service s;
    

    这将返回“服务”表中的列以及一个额外的“date_range_test”列,该列将包含 90、60、30 或 NULL。 CASE 表达式中的第一个匹配项获胜。额外的好处是,您可以手动运行此查询并非常轻松地查看每一行的输出。如所写,这会将所有内容截断到比较之前日期的午夜。

    【讨论】:

    • 迈克尔,我真的很喜欢你的解决方案,但我似乎无法让它发挥作用。我创建了一个名为“boosterWithinDays”的新列,并希望将其更改为 90、60 或 30,具体取决于它是否在该时间范围内。我完全尝试了您的代码,但无法使其正常工作。非常感谢任何帮助。
    • 我不确定你的意思,但我可能在我的示例中不清楚:“date_range_test”不是一个真正的列,它只是一个将出现在结果集中的列, 由查询派生而来mysql 命令行客户端或您通常运行手动查询的任何地方)?
    • 对不起迈克尔。我需要它来检查 boosterDate,然后将另一列 boosterWithinDays 填充为 30、60 或 90。我真的很喜欢不使用 PHP 来执行此操作的想法,但我在试图让一些如此简单的东西正常工作时遇到了巨大的问题。任何帮助表示赞赏。
    【解决方案3】:

    您只能以 DateTime 格式比较日期,但在您的情况下,$boosterDate 是一个字符串。您的代码应如下所示:

    ...
    while($row = $result->fetch_array()){
        $boosterDate = date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $row['boosterDate'])));
    
    }
    ...
    

    【讨论】:

    • 我想使用 DateTime 对象。是否可以采用 Y-m-d 格式的 MySQL 日期并使用 DateTime 对象转换为 iso?另外,为什么日期会在 MySQL 中存储为日期,但在我运行查询时会转换为字符串?我对你的回答有点困惑。能详细点吗?
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2021-03-15
    • 2011-09-11
    • 2012-02-06
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多