2013-10-06 7 views
8

У меня есть таблица, содержащая данные о событиях и фестивалях со следующими столбцами, в которых записаны даты начала и окончания.Сравнение дат по месяцам и годам в mysql

  • Дата_начала
  • датой_окончания

формат даты в YYYY-MM-DD. Мне нужно получить информацию о событии со следующим условием.

  • Необходимо получить все события, начинающиеся с текущего месяца, и там даты окончания могут быть любыми словами currentDate+next30days.

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

Может ли кто-нибудь помочь мне указать, как я могу это сделать?

ответ

13
select * from your_table 
where year(Start_Date) = year(curdate()) 
and month(Start_Date) = month(curdate()) 
and end_date <= curdate() + interval 30 day 
+1

Всегда забываем 'CURDATE()' function ':]', поэтому +1 – BlitZ

+0

Спасибо, это получилось довольно неплохо –

+0

Я думаю, что 'now()' легче запомнить. – daVe

4

DateTime functions Ваши друзья:

SELECT 
    * 
FROM 
    `event` 
WHERE 
    (MONTH(NOW()) = MONTH(`Start_Date`)) 
    AND 
    (`End_Date` <= (NOW() + INTERVAL 30 DAY)) 
    AND 
    (YEAR(NOW()) = YEAR(`Start_Date`)) 
+1

Спасибо за предоставление быстрого решения +1 –

3

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

Итак, я пошел бы для:

where start_date >= date_add(curdate(), interval 1 - day(curdate()) day) and 
     start_date < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 1 month) 

Все функции даты находятся на curdate(), что не влияет на способность MySQL использовать индекс в этом случае.

Вы можете также включить условие о end_date:

where (start_date >= date_add(curdate(), interval 1 - day(curdate()) day) and 
     start_date < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 1 month) 
    ) and 
     end_date <= date_add(curdate(), interval 30 day) 

Это все еще может воспользоваться индексом.

Смежные вопросы