как получить месяц с даты в mysql

Я хочу, чтобы получить результаты от mysql с таким утверждением:

SELECT * FROM table WHERE amount > 1000 

Но я хочу получить результат, ограниченный определенным месяцем и годом (на основе ввода от пользователя) … Я пробовал вот так:

 SELECT * FROM table WHERE amount > 1000 AND dateStart = MONTH('$m') 

$m – месяц, но он дал ошибку.

В этой таблице на самом деле есть две даты: startDate и endDate но я сосредоточен на startDate . Входными значениями будут месяц и год. Как я выражаю выражение SQL, которое получает результаты, основанные на этом месяце того года?

Вы были близки – получили сравнение назад (если startDate является типом данных DATETIME или TIMESTAMP):

 SELECT * FROM table WHERE amount > 1000 AND MONTH(dateStart) = {$m} 

Предостережения:


  • Имейте в виду, что вы используете mysql_escape_string или вы рискуете атаками SQL-инъекций .
  • Вызов функций по столбцам означает, что индекс, если он существует, не может быть использован

Альтернативы:


Поскольку использование функций в столбцах не может использовать индексы, лучшим подходом было бы использовать функции BETWEEN и STR_TO_DATE :

 WHERE startdate BETWEEN STR_TO_DATE([start_date], [format]) AND STR_TO_DATE([end_date], [format]) 

См. Документацию по синтаксису форматирования.

Справка:


  • МЕСЯЦ
  • ГОД
  • МЕЖДУ
  • STR_TO_DATE

Используйте функцию month() .

 select month(now()); 

Попробуй это:

 SELECT * FROM table WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m') 

Например

 $date = sprintf("'%04d-%02d-01'", $year, $month); $query = " SELECT x,y,dateStart FROM tablename WHERE AND amount > 1000 AND dateStart >= $date AND dateStart < $date+Interval 1 month "; mysql_query($query, ... 

Это создаст такой запрос, как например

 WHERE AND amount > 1000 AND dateStart >= '2010-01-01' AND dateStart < '2010-01-01'+Interval 1 month 

+ Interval 1 month является альтернативой date_add () .

SELECT Date('2010-01-01'+Interval 1 month) -> 2010-02-01
SELECT Date('2010-12-01'+Interval 1 month) -> 2011-01-01
Таким образом, вы всегда получаете первый день следующего месяца. Записи, которые вы хотите, должны иметь дату начала до этой даты, но после / равного первому дню месяца (и года), который вы передали sprintf ().
'2010-01-01'+Interval 1 month не меняется между строками. MySQL будет вычислять термин только один раз и может использовать индексы для поиска.

Попробуй это

 SELECT * FROM table WHERE amount > 1000 AND MONTH(datestart) GROUP BY EXTRACT(YEAR_MONTH FROM datestart) 

Попробуйте это, если (поле даты – это текст, затем преобразуйте эту строку в дату):

 SELECT * FROM `table_name` WHERE MONTH(STR_TO_DATE(date,'%d/%m/%Y'))='11' //This will give month number MONTH(STR_TO_DATE(date,'%d/%m/%Y')) //If its return 11 then its November // Change date format with your date string format %d/%m/%Y 

Работает в: MySQL 5.7, MySQL 5.6, MySQL 5.5, MySQL 5.1, MySQL 5.0, MySQL 4.1, MySQL 4.0, MySQL 3.23

  • День:

     SELECT EXTRACT(DAY FROM "2017-06-15"); 
  • Месяц:

     SELECT EXTRACT(MONTH FROM "2017-06-15"); 
  • Год:

     SELECT EXTRACT(YEAR FROM "2017-06-15");