【问题标题】:Selecting a date range where date is not null with Propel使用 Propel 选择日期不为空的日期范围
【发布时间】:2010-05-04 23:44:16
【问题描述】:

使用 Propel 我想查找日期字段不为空且介于特定范围之间的记录。

注意不幸的是,由于这是更大查询的一部分,我无法在此处使用自定义 SQL 查询。

例如:我可能有这样的记录:

---------------------
| ID | DUE_DATE     |
---------------------
| 1  |  NULL        |
| 2  |  01/01/2010  |
| 3  |  02/01/2010  |
| 4  |  NULL        |
| 5  |  05/01/2010  |
---------------------

我可能想要返回due_date 介于01/01/2010 和02/01/2010 之间的所有行,但我不想返回due_date 为NULL 的那些记录。

在示例中,我只想返回第 2 行和第 3 行。

但是,Propel 似乎覆盖了我的 NOTNULL 标准。

Propel 可以做到这一点吗?

谢谢!

【问题讨论】:

    标签: symfony1 propel date-range


    【解决方案1】:

    为什么要创建单独的 Criterion 对象?

    $start_date = mktime(0, 0, 0, date("m")  , date("d")+$start, date("Y"));
    $end_date = mktime(0, 0, 0, date("m")  , date("d")+$end, date("Y"));
    
    $c = new Criteria();
    $c->add(TaskPeer::DUE_DATE, $end_date, Criteria::LESS_EQUAL);
    $c->addAnd(TaskPeer::DUE_DATE, $start_date, Criteria::GREATER_EQUAL);
    $c->addAnd(TaskPeer::DUE_DATE, null, Criteria::ISNOTNULL);
    

    当我在 Propel 1.2、1.3 或 1.4 中尝试此操作时,我得到以下 SQL 语句:

    SELECT task.TASK_ID, task.DUE_DATE FROM task WHERE ((task.DUE_DATE<=:p1 AND task.DUE_DATE>=:p2) AND task.DUE_DATE IS NOT NULL )

    $c->add() 方法替换给定字段的当前标准。您为 TaskPeer::DUE_DATE 创建标准,因此它们将始终替换以前的标准。

    【讨论】:

    • 好的 - 我可能只需要升级到 Propel 1.4 不是吗!谢谢你的回答。
    • 我在 Propel 1.2 和 1.3 中重新测试了这个,得到了相同的结果。因此,虽然您可以升级(也许现在选择 1.5,它更稳定并且更适合查询构建),但您不必这样做。
    • 太棒了。感谢您返回并为我进行测试。直到今天晚上我才有机会再看这个问题。
    【解决方案2】:

    我没有得到删除空条目部分,我认为它会产生:tasks.due_date IS NULL AND tasks.due_date IS NULL

    无论如何,也许您可​​以使用Criteria::CUSTOM 编写原始SQL WHERE 子句?来自 Propel documentation 的示例:

    $con = Propel::getConnection(ReviewPeer::DATABASE_NAME);
    
    $c = new Criteria();
    $c->add(ReviewPeer::REVIEW_DATE, 'to_date('.ReviewPeer::REVIEW_DATE.', \'YYYY-MM-DD\') = '.$con->quote($date->format('Y-m-d'), Criteria::CUSTOM);
    

    【讨论】:

    • 感谢您的回答。不幸的是,我正在做的事情无法自定义 SQL,因为这是更大查询的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多