2013-12-22 3 views
3

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

Наименование таблицы: деятельность.

activity_id , Date  , assign_engr , Task_Type , Task_Status 
1   , 2013-12-31 , Sachin  , Monthly , Scheduled 
2   , 2013-12-23 , Mikel  , Weekly , Done 
3   , 2013-10-18 , John  , Monthly , Done 

Я хочу, чтобы получить данные за текущий месяц только с помощью поля даты, как показано ниже:

select * from activity where Date='current month' 

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

ответ

6

Вы можете попробовать так:

select * from activity where MONTH(`Date`)=MONTH(NOW()) 
and YEAR(`Date`)=YEAR(NOW()) 
+1

Спасибо большое .......... – Basudev

+0

@Basudev: - Вы можете. Примите это как ответ, если это вам помогло! –

+0

Еще раз спасибо за помощь. согласно моей таблице, я могу получить имя дня соответствующей даты с использованием запроса. пожалуйста помогите. – Basudev

1

Оказывается, вы хранения даты в MySQL формат даты, так что это должно работать:

SELECT * FROM activity 
WHERE date_format(activity.`Date`, '%Y-%m') = date_format(now(), '%Y-%m') 

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

+0

Хороший звонок по году – reformed

+1

Спасибо; Ответ Рахула был хорошим, но просто хотел прояснить эту альтернативу, чтобы быть в безопасности. Таким образом, Басудеву не нужно учиться, как всем остальным: –

-1

Вот индекс дружественный альтернатива (при условии, что date не содержит компоненты времени, а это означает, что это типа DATE)

SELECT * 
    FROM activity 
WHERE date BETWEEN LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
       AND LAST_DAY(CURDATE()) 

Примечание:

  1. Убедитесь, что вы имеют индекс на date столбец
  2. Не применяйте какие-либо функции (например, MONTH(), YEAR() ...) в колонке, которую вы ищете, по адресу, потому что это делает недействительным использование любого индекса (индексов), который может быть у вас на нем, что вызывает полное сканирование в таблице.

Вот SQLFiddle Demo

+0

Жаль, нет, не всегда будет работать: '2013-02-28' - 1 месяц:' 2013-01-28' + 1 день: '2013-01-29'; на 3 дня (29, 30, 31). Чтобы получить начало месяца, вычтите текущий день - 1. Вы также должны избегать использования «BETWEEN» в пользу эксклюзивной верхней границы (т.е. меньше, чем начало следующего месяца), что позволит запрос на работу независимо от того, имеет ли «дата» компоненты времени. Но да, этот базовый подход позволяет использовать индексы. –

+0

@ Clockwork-Muse Спасибо за вход :). Конечно, это должно быть + 1day -1month. Это была опечатка. Я слишком поздно опоздал. Теперь использование BETWEEN является вопросом предпочтения, если оно используется без компонента времени. – peterm

+0

... И почему бы не сделать это безопасным для этой ситуации (с компонентами времени), что не требует гораздо больших усилий? –

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