Попытка отфильтровать таблицу MySQL по дате, используя один запрос

0

Я пытаюсь запросить любые записи из таблицы, которые появляются или после сегодняшней даты, используя один запрос.
Все даты для каждой записи хранятся в отдельных столбцах, например: один для 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";

И для того, чтобы протестировать его, я создал запись в базе данных с датой вчера, но эта запись по-прежнему отображается в списке возвращенных записей. Что я делаю не так?: (

  • 2
    Почему вы используете 3 столбца вместо одного столбца с типом DATE?
Теги:
database

4 ответа

1
Лучший ответ

Я не знаю, можете ли вы использовать "& &" вместо "И" в вашем контексте - возможно, попробуйте изменить свой SQL для использования

" AND month>=".$month_today." AND day>=".$day_today."

EDIT:

в качестве дополнения к ответу Ника, чтобы сделать 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";

... но это начинает становиться все более грязным, чем преобразование в даты и использование сравнения даты

EDIT2:

но затем, если эти столбцы индексированы, могут использоваться индексы. Это все равно гораздо больше усилий, чтобы кодировать SQL таким образом, если производительность с использованием преобразования в даты вполне приемлема.

  • 0
    Документация mysql утверждает, что AND и && эквивалентны
  • 2
    Если честно, я чему-то учусь каждый день. Две вещи несколько дней.
Показать ещё 1 комментарий
5

Это может быть достигнуто с использованием временных функций красивым способом, в то время как лучше использовать столбец DATE.

SELECT * FROM TABLE WHERE TIMESTAMP(CONCAT(year,"-",month,"-",day)) >= CURDATE()

ok, это зло, поскольку оно не использует индекс... правильная вещь была бы столбцом DATE, но все это вручную раздражает, так как вам также нужно рассмотреть случай, когда год больше, но месяцы меньше и вещи....

1

чтобы проверить, прошла ли дата после другой даты, этот запрос не будет выполнен:

$sql = "SELECT * FROM table WHERE year>=".$year_today." && month>=".$month_today." && day>=".$day_today." ORDER BY year, month, day";

день 12 марта februari меньше, чем 15-й день в februari, но все еще после него, потому что он в другом месяце....

  • 0
    Вы уверены, что февраль после марта?
  • 0
    Хотя февраль не после марта ... его точка зрения верна. Логика исходного вопроса не имеет смысла, поскольку требует, чтобы месяц, день и год были численно больше.
1

Чтобы сравнить даты с датами:

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')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню