Я пытаюсь запросить любые записи из таблицы, которые появляются или после сегодняшней даты, используя один запрос.
Все даты для каждой записи хранятся в отдельных столбцах, например: один для month
, один для year
и один для day
.
очевидно, я получаю все записи, которые происходят после года в сегодняшнюю дату
$sql = "SELECT * FROM table WHERE year>=".$year_today."
ORDER BY year, month, day";
Затем я пытался немного отфильтровать это, используя:
$sql = "SELECT * FROM table
WHERE year>=".$year_today." && month>=".$month_today."
&& day>=".$day_today."
ORDER BY year, month, day";
И для того, чтобы протестировать его, я создал запись в базе данных с датой вчера, но эта запись по-прежнему отображается в списке возвращенных записей. Что я делаю не так?: (
Я не знаю, можете ли вы использовать "& &" вместо "И" в вашем контексте - возможно, попробуйте изменить свой SQL для использования
" AND month>=".$month_today." AND day>=".$day_today."
в качестве дополнения к ответу Ника, чтобы сделать SQL-код корректным, вы могли бы закодировать:
$sql = "SELECT * FROM table WHERE (
(year>".$year_today.")
OR (year=".$year_today." && month>".$month_today." )
OR (year=".$year_today." && month=".$month_today."&& day>=".$day_today.")
)
ORDER BY year, month, day";
... но это начинает становиться все более грязным, чем преобразование в даты и использование сравнения даты
но затем, если эти столбцы индексированы, могут использоваться индексы. Это все равно гораздо больше усилий, чтобы кодировать SQL таким образом, если производительность с использованием преобразования в даты вполне приемлема.
Это может быть достигнуто с использованием временных функций красивым способом, в то время как лучше использовать столбец DATE.
SELECT * FROM TABLE WHERE TIMESTAMP(CONCAT(year,"-",month,"-",day)) >= CURDATE()
ok, это зло, поскольку оно не использует индекс... правильная вещь была бы столбцом DATE, но все это вручную раздражает, так как вам также нужно рассмотреть случай, когда год больше, но месяцы меньше и вещи....
чтобы проверить, прошла ли дата после другой даты, этот запрос не будет выполнен:
$sql = "SELECT * FROM table WHERE year>=".$year_today." && month>=".$month_today." && day>=".$day_today." ORDER BY year, month, day";
день 12 марта februari меньше, чем 15-й день в februari, но все еще после него, потому что он в другом месяце....
Чтобы сравнить даты с датами:
SELECT * FROM table WHERE
STR_TO_DATE(
CONCAT(year
, '-'
, right(concat('00', month), 2)
, '-'
, right(concat('00', day), 2))
, '%Y-%m-%d')
>= STR_TO_DATE('2009-12-11', '%Y-%m-%d')