【问题标题】:MySQL and PDO query discrepanciesMySQL 和 PDO 查询差异
【发布时间】:2021-05-09 03:58:14
【问题描述】:

我有一个问题我没有找到解决方案,使用 PDO 的 PHP 进行的相同查询在直接从 MySQL 控制台执行时返回不同的结果(来自控制台的结果与预期一致)。

从 PDO 它返回 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);

【问题讨论】:

  • 根据您的示例数据,MySQL 查询返回错误的结果:db-fiddle.com/f/j4wQzSpJn5nUXaEc5aXQoh/0。我怀疑您可能对时区有疑问 - 您可能想在 MySQL 服务器上的演示中尝试我的第一个查询,看看您得到什么结果...

标签: php mysql pdo


【解决方案1】:

好的,关于时区的评论让我开始思考(虽然这不是问题,因为自从 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();

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多