【发布时间】:2011-11-04 19:56:40
【问题描述】:
我有YYYY-MM 格式的日期列表,并且我有一个包含starts_at 和ends_at 列的记录表。
我想查找传入列表中任何给定日期在starts_at 和ends_at 范围内的所有记录。
所以,鉴于2011-01, 2011-05, 2011-10,我想要:
| id | starts_at | ends_at | title |
| 3 | 2010-12-05 00:00:00 | 2011-02-02 00:00:00 | something cool |
| 4 | 2011-03-14 00:00:00 | 2011-05-01 00:00:00 | something else really cool |
| 5 | 2011-10-31 00:00:00 | 2012-12-23 00:00:00 | argh! end of the world! not cool! |
...虽然这些记录将被省略:
| id | starts_at | ends_at | title |
| 6 | 2010-10-05 00:00:00 | 2010-12-02 00:00:00 | something uncool |
| 7 | 2011-03-14 00:00:00 | 2011-04-31 00:00:00 | something else really uncool |
| 8 | 2011-12-23 00:00:00 | 2013-01-01 00:00:00 | yay! we're still alive! cool! |
如何在 SQL 中编写 WHERE 条件?
澄清:我正在寻找纯 SQL 的解决方案(我正在使用存储过程,因此通过 PHP 等其他语言进行动态注入实际上是不可能的,至于我知道),日期列表作为string(HTML 表单输入)传递给查询。如果我可以在 SQL 中以编程方式执行此操作,我很乐意将其分解为连续的 BETWEEN 语句,但我不知道如何执行此操作。
基本上,我需要一种在纯 SQL 中表达以下逻辑的方法:
$months = explode(',', '2011-01,2011-05,2011-10');
$q = "SELECT records.* FROM records WHERE";
foreach($months as $month) {
$q .= " '$month' BETWEEN records.starts_at AND records.ends_at OR";
}
$q = substr($q, 0, -3) . ';';
【问题讨论】: