У меня есть список дат в формате 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! |
Как бы я написал это WHERE
условие в SQL?
Уточнение : Я ищу решение на чистом SQL (я работаю с хранимой процедурой, поэтому динамическое внедрение через какой-то другой язык, например PHP, на самом деле не представляется возможным, поскольку знать), и список дат передается в запрос в виде string
(ввод формы HTML). Я хотел бы разбить его на последовательные BETWEEN
операторы, если бы я мог сделать это программно в SQL, но я понятия не имею, как это сделать.
По сути, мне нужен способ выразить следующую логику в чистом 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) . ';';