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

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

SELECT * 
  FROM table 
 WHERE amount > 1000 

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

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

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

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

Ответы

Ответ 1

Вы были близки - получили сравнение назад (если 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])

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

Справка:


Ответ 2

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

select month(now());

Ответ 3

например.

$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 будет вычислять термин только один раз и может использовать индексы для поиска.

Ответ 4

Попробуйте следующее:

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Работает в: 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");