0

在 mysql db 中,我在 t1 表中定义了一个时间戳字段(dateexp)。对于查询,我只考虑使用时间戳的格式 Ymd 来查找记录。使用 curdate() 而不是 now()

SELECT * FROM t1 WHERE dateexp < currdate()

我想用 php 做同样的事情,使用 DateTime 类来查找直到某个日期的天数,但我不明白如何只比较 Ymd 格式。

我尝试过这种方式,但我使用 Ymd 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');

我怎么能这样做只比较 Ymd?我尝试使用 DateTime::createFromFormat 但可能是错误的方式..

谢谢

4

2 回答 2

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 中选择其他字段

于 2013-11-06T10:51:48.777 回答
0

PHP

不要date()DateTime extensionstrtotime()混合使用。

您可以使用关键字创建 DateTime 对象today来设置没有时间的今天日期,或者DateTime::setTime()在 DateTime 对象上使用来设置您希望的时间:

$d1 = new DateTime('today');
$d2 = new DateTime($row['dateexp']);
$d2->setTime(0, 0);
echo $d1->diff($d2)->format('%r%a');

演示


MySQL

或者您已经可以使用函数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()
于 2013-11-06T11:20:56.467 回答