Как я могу получить месяц от даты в MySQL - PullRequest
23 голосов
/ 11 января 2010

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

SELECT * 
  FROM table 
 WHERE amount > 1000 

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

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

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

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

Ответы [ 7 ]

39 голосов
/ 11 января 2010

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

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

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


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


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

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

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

Справка:


7 голосов
/ 11 января 2010

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

select month(now());
3 голосов
/ 11 января 2010

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

SELECT * 
FROM table 
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
3 голосов
/ 11 января 2010

1001 * Е.Г. *

$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
Таким образом, вы всегда получите первый день следующего месяца. У записей, которые вы хотите, должно быть dateStart до этой даты, но после или равного первому дню месяца (и года), который вы передали sprintf ().
'2010-01-01'+Interval 1 month не меняется между рядами. MySQL вычислит термин только один раз и может использовать индексы для поиска.

0 голосов
/ 03 августа 2017

Работает в: 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");
    
0 голосов
/ 23 декабря 2016

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

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
0 голосов
/ 17 ноября 2015

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

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