为什么 Symfony/Doctrine 查询对使用 CURRENT_TIMESTAMP() 调试的查询给出了不同的答案


Why is Symfony/Doctrine query giving me a different answer to debugged query with CURRENT_TIMESTAMP()?

我删除的记录没有被过滤掉。

原则查询生成器表达式为:

  $q = $this->createQueryBuilder('duty')
    ->select(array('duty'))
    ->where('duty.validFrom < CURRENT_TIMESTAMP() AND (duty.deleted IS NULL OR duty.deleted > CURRENT_TIMESTAMP())')
    ->orderBy('duty.rank', 'ASC')
    ->addOrderBy('duty.validFrom', 'DESC')
    ->getQuery();

我得到了 6 个结果(半小时前删除了一个结果。

我拿起一个调试器并评估$q->getSQL((。它给了我:

SELECT e0_.id AS id_0, e0_.name AS name_1, e0_.rank AS rank_2, e0_.rate AS rate_3, e0_.validFrom AS validfrom_4, e0_.deleted AS deleted_5, e0_.created AS created_6, e0_.updated AS updated_7 
FROM employmentduty e0_ 
WHERE e0_.validFrom < CURRENT_TIMESTAMP 
AND (e0_.deleted IS NULL OR e0_.deleted > CURRENT_TIMESTAMP) 
ORDER BY e0_.rank ASC, e0_.validFrom DESC

我直接针对 postgres 运行并得到 5 个结果,删除的项目被过滤掉。

php 的时区是 'Australia/Sydney',postgres 时区 ( show timezone ( 设置为 Etc/GMT-10

我在postgresql.conf中设置了timezone = 'Australia/Sydney',以便时区与PHP设置匹配。此应用程序只有一个时区,所以这很好。

日期当然是使用 ->setDeleted(new DateTime()) 设置的,它使用 php 现在的概念,而查询是用 CURRENT_TIMESTAMP 完成的,这是不一致的原因。