使用php和mysql数据库比较两个日期

使用php和mysql数据库比较两个日期,php,mysql,sql,date,datetime,Php,Mysql,Sql,Date,Datetime,我试图将一个日期与MySQL数据库中距离当前日期大于90天、60天或30天的日期进行比较。我正在使用DateTime对象,它很容易操作,但是我在获取我想要的响应时遇到了问题。非常感谢您的帮助 <?php //date_default_timezone_set('America/Chicago'); $todaysDate = new DateTime('now'); $formattedDate = $todaysDate->format('Y-m-d'); $date = new

我试图将一个日期与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 />";


}               

?>

我假设您正在使用Mysql日期类型字段作为boosterDate

检查您的mysql数据库时区

SELECT @@global.time_zone, @@session.time_zone;
检查您的php时区

date_default_timezone_get

确保它们匹配,如果不匹配,请进行调整。

不确定这是否是您想到的修复方法,但我不喜欢数据库如此顺利地处理应用程序中的日期搜索。。。您可以用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;

这将返回“服务”表中的列以及额外的“日期范围测试”列,该列将包含90、60、30或NULL。案例表达式中的第一场比赛获胜。额外的好处是,您可以手动运行此查询,并非常轻松地查看每一行的输出。如前所述,这将在比较之前的日期将所有内容截断到午夜

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

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

}
...

DATETIME
列不被MySQL时区逻辑转换,只被
TIMESTAMP
列转换<代码>日期时间列是不支持时区的文本。@它们可能位于错误的时区时段。最好将所有数据存储为UTC并根据需要进行转换,但不是每个人都这样做。MySQL数据库是system,php时区是UTC。我想使用DateTime对象。是否可以采用Y-m-d格式的MySQL日期并使用DateTime对象转换为iso?另外,为什么在MySQL中日期会存储为日期,但在运行查询时会转换为字符串?我对你的回答有点困惑。你能详细说明一下吗?迈克尔,我真的很喜欢你的解决方案,但我似乎无法让它发挥作用。我创建了一个名为“boosterWithinDays”的新列,并希望根据时间范围将其更改为90、60或30。我完全尝试了您的代码,但无法使其正常工作。非常感谢您的帮助。我不确定您的意思,但在我的示例中我可能不清楚:“date_range_test”不是一个真正的列,它只是一个将出现在结果集中的列,由查询派生,根据未来boosterDate与当前日期的比较程度,查询本身应填充30/60/90或null。。。如果您完全按照编写的方式运行查询(直接在mysql命令行客户机中或在您通常运行手动查询的任何地方),那么查询是否不起作用。我需要它检查boosterDate,然后在30、60或90天内填充另一列boosters。我真的很喜欢不使用PHP来做这件事,但我在尝试让这么简单的东西正常工作时遇到了巨大的问题。感谢您的帮助。