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();
我有一个问题我还没有找到解决方案,从 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();