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

发布于 2024-08-31 09:03:57 字数 590 浏览 4 评论 0原文

使用 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 做到这一点吗?

谢谢!

Using Propel I would like to find records which have a date field which is not null and also between a specific range.

N.B. Unfortunately, as this is part of a larger query, I cannot utilise a custom SQL query here.

For example: I may have records like this:

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

I may want to return all the rows with a due_date between 01/01/2010 and 02/01/2010 but I don't want to return those records where due_date is NULL.

In the example I only want to return rows 2 and 3.

However, Propel seems to overwrite my NOTNULL criteria.

Is it possible to do this with Propel?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绝影如岚 2024-09-07 09:03:57

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

Why do you create the separate Criterion objects?

$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);

When I try this in Propel 1.2, 1.3 or 1.4, I get the following SQL statement:

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 )

The $c->add() method replaces the current criterion for the given field. You create your Criterions for TaskPeer::DUE_DATE, so they will always replace the previous ones.

单身情人 2024-09-07 09:03:57

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

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

$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);

I did't get remove the null entries section, I think it will produce: tasks.due_date IS NULL AND tasks.due_date IS NULL.

Anyway, maybe you can use Criteria::CUSTOM to write raw-SQL WHERE clause? Example from 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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文