Я хочу, чтобы получить результаты от 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}
Поскольку использование функций в столбцах не может использовать индексы, лучшим подходом было бы использовать функции BETWEEN
и STR_TO_DATE
:
WHERE startdate BETWEEN STR_TO_DATE([start_date], [format]) AND STR_TO_DATE([end_date], [format])
См. Документацию по синтаксису форматирования.
Используйте функцию 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");