MySQL 和 PDO 查询不一致

MySQL and PDO query discrepancies

我有一个问题我还没有找到解决方案,从 PHP 和 PDO returns 直接从 MySQL 控制台执行的相同查询结果不同(控制台的结果符合预期。

来自 PDO 它 returns 2 个结果和 MySQL 3 个结果。

我会给出一些背景信息:

数据:

SELECT id, startDate, endDate FROM  publications_elements;
+----+---------------------+---------------------+
| id | startDate           | endDate             |
+----+---------------------+---------------------+
|  1 | 2021-05-08 21:00:00 | NULL                |
|  2 | 2021-05-08 00:00:00 | 2021-05-08 20:00:00 |
|  3 | NULL                | 2021-05-08 23:20:00 |
|  4 | NULL                | NULL                |
+----+---------------------+---------------------+

有问题的查询

SELECT
    id, 
    startDate,
    endDate
FROM publications_elements 
WHERE
    (UNIX_TIMESTAMP(startDate) <= 1620531853 OR startDate IS NULL) AND 
    (UNIX_TIMESTAMP(endDate) > 1620531853 OR endDate IS NULL)

MySQL 控制台中的结果

+----+---------------------+---------------------+
| id | startDate           | endDate             |
+----+---------------------+---------------------+
|  1 | 2021-05-08 21:00:00 | NULL                |
|  3 | NULL                | 2021-05-08 23:20:00 |
|  4 | NULL                | NULL                |
+----+---------------------+---------------------+

PHP PDO

的结果
+----+---------------------+---------------------+
| id | startDate           | endDate             |
+----+---------------------+---------------------+
|  1 | 2021-05-08 21:00:00 | NULL                |
|  4 | NULL                | NULL                |
+----+---------------------+---------------------+

有什么想法吗?

提前致谢。

编辑 1

PHP

中的代码
$timestamp = (new \DateTime)->getTimestamp();
$SQL = "SELECT id, startDate, endDate FROM publications_elements WHERE (UNIX_TIMESTAMP(startDate) <= {$timestamp} OR startDate IS NULL) AND (UNIX_TIMESTAMP(endDate) > {$timestamp} OR endDate IS NULL)";
$prepared = $PDOInstance->prepare($SQL);
$prepared->execute();
$result = $prepared->fetchAll(\PDO::FETCH_OBJ);

好的,关于时区的评论让我开始思考(虽然这不是问题,因为自 PDO 初始化以来我已经同步了 PHP 和 MySQL 时区)。

我注意到 startDate 和 endDate 字段存储为 Y-m-d H:i:s,但是秒数始终为 00,因此在非常接近的时间里秒数会出现差异。我通过从对象中删除秒来解决这个问题。

类似于:

$timestamp = \DateTime::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:00'))->getTimestamp();