在mysql db中,我在t1表中定义了一个时间戳字段(dateexp)。 查询我只考虑格式化时间戳的Y-m-d来查找记录。使用curdate()而不是now()
SELECT * FROM t1 WHERE dateexp < currdate()
我想用php使用DateTime类来查找日期之前的天数 但是我无法理解如何只比较Y-m-d格式。
我试过这种方式,但我使用Y-m-d H:i:s格式。
$row['dateexp'] = "2013-11-10 12:00:00";
$d1 = new DateTime();
$d2 = new DateTime($row['dateexp']);
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');
我怎么能只比较Y-m-d?我尝试使用DateTime :: createFromFormat,但可能是错误的方式..
由于
答案 0 :(得分:2)
您有几种可行的方法可以做到这一点。首先,您可以从DBMS中选择所需格式的日期字符串:
SELECT *, DATE(dateexp) AS date_holder FROM t1 WHERE dateexp < currdate()
然后将其应用于DateTime
对象:
$d1 = new DateTime(date('Y-m-d'));
$d2 = new DateTime($row['date_holder']);
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');
第二 - 正如您所提到的,您可以从格式:
创建DateTime
$d1 = new DateTime(date('Y-m-d'));
$d2 = new DateTime(date('Y-m-d', strtotime($row['dateexp'])));
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');
- 您将能够避免在DBMS中选择其他字段
答案 1 :(得分:0)
请勿将date()
和strtotime()
函数与DateTime extension混合。
您可以使用关键字today
创建DateTime对象,以便在没有时间的情况下设置今天的日期,或者在DateTime对象上使用DateTime::setTime()
来设置您希望的时间:
$d1 = new DateTime('today');
$d2 = new DateTime($row['dateexp']);
$d2->setTime(0, 0);
echo $d1->diff($d2)->format('%r%a');
<强> Demo 强>
或者您已经可以使用函数TIMESTAMPDIFF计算MySQL中的天差:
SELECT TIMESTAMPDIFF(DAY, CURDATE(), DATE('2013-11-10 12:00:00'))
或在你的情况下:
SELECT *, TIMESTAMPDIFF(DAY, CURDATE(), DATE(dateexp)) AS diff_in_days
FROM t1
WHERE dateexp < CURDATE()
答案 2 :(得分:0)
不依赖于MySQL,在两个DateTime对象上调用setTime(0, 0, 0)
(如果需要,首先克隆它们)以将时间重置为午夜,然后使用$dateTime1 <= $dateTime2
的结果仅比较天数。干净易读。
$dateTime1->setTime(0, 0, 0);
$dateTime2->setTime(0, 0, 0);
$dateTime1 < $dateTime2;
$dateTime1 <= $dateTime2; // same day will return true