使用Propel选择日期不为空的日期范围

时间:2010-05-04 23:44:16

标签: symfony1 propel date-range

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

N.B。不幸的是,由于这是更大查询的一部分,我不能在这里使用自定义SQL查询。

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

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

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

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

然而,Propel似乎覆盖了我的NOTNULL标准。

是否可以使用Propel执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:4)

为什么要创建单独的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创建了标准,因此它们将始终替换之前的标准。

答案 1 :(得分:2)

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

无论如何,也许您可​​以使用Criteria::CUSTOM编写raw-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);