【问题标题】:Doctrine 2 - Filter results by a datetime field's date partDoctrine 2 - 按日期时间字段的日期部分过滤结果
【发布时间】:2012-05-30 21:15:24
【问题描述】:

我有一个名为 Szerzodes 的理论实体,其日期时间字段名为 exportalva。是否有可能以某种方式获取 exportalva 字段的日期部分是给定值的记录?例如,我想获取在给定日期导出的记录,而不考虑时间。我试过了

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE DATE(sz.exportalva) = '2012-05-17'")

但它失败了,因为 DATE() 不是 DQL 的已知函数。现在我暂时用

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE sz.exportalva LIKE '2012-05-17%'")

但这对我来说似乎是一个丑陋的黑客。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: datetime doctrine-orm


    【解决方案1】:

    考虑到您的数据库中有一个 DATETIME 字段,可能是使用 LIKE(这完全取决于数据库和表的引擎)您没有使用以下算法已针对 DATE 操作进行了优化。

    一种解决方案是使用 DQL 支持的 BETWEEN 运算符指定一整天(从第一秒到最后一秒),如 EBNF 所示:

    $em->createQuery("SELECT sz FROM Szerzodes sz WHERE sz.exportalva BETWEEN '2012-05-17 00:00:00' AND '2012-05-17 23:59:59'")
    

    如果您真的想为此使用函数,那么始终在值中使用函数而不是在条件中使用的列也是一个好主意。某些数据库(如 MySQL)不在本机函数修改的列中使用索引。您可以使用 DQL User defined function 创建一个名为 DATE 的用户函数,它可以满足您的期望(它可以轻松完成上述示例)。

    【讨论】:

    • 在 MySQL、PostgreSQL 和 SQLite3 中有一个 DATE() 函数,我手头没有 MSSQL 和 Oracle 来测试它,想知道为什么它没有在 DQL 中实现。这个 BETWEEN 东西对我来说似乎比以前的 LIKE 东西要好,也许比我以前的 DATE() 想法更好。
    • 我的判断可能有点幼稚,但是关于时区问题有很多问题。 SQL 没有以标准方式处理这个问题,忽略它将是一个大问题......
    • 虽然在一个国际项目中我会感谢你警告我,但在这种情况下这不会是一个问题。
    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多