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

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

SELECT * 
  FROM table 
 WHERE amount > 1000 

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

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

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

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

23
задан OMG Ponies 11 January 2010 в 04:14
поделиться

4 ответа

Вы были закрыты - получили сравнение обратно (при условии StartDate - это тип данных DateTime или Timestamp):

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

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


  • Умерение, которое вы используете MySQL_ESCAPE_STRING ИЛИ ВЫ РИСК Атаки инъекций SQL .
  • Функциональные вызовы на столбцах означает, что индекс, если кто-то существует, нельзя использовать

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


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

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

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

Ссылка:


39
ответ дан 29 November 2019 в 01:30
поделиться

, Например.

$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

+ Интервал 1 месяц является альтернативой дата _ добавить () .

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

3
ответ дан 29 November 2019 в 01:30
поделиться

Почему GCC оптимизирует так плохо для такой общей операции?

Prelude: С конца 1980-х годов фокус на оптимизацию компилятора отошел от микробенчевок, которые сосредоточены на индивидуальных операциях и в направлении MacrObenchmarks , которые сосредоточены на приложениях. В наши дни большинство писателей компилятора сосредоточены на Macrobenchmarks, и разработка хороших бенчарных люксов - это то, что воспринимается серьезно.

Ответ : Никто на GCC не использует ориентир, где разница между или и BTS имеет значение для времени выполнения реальной программы. Если вы можете произвести такую ​​программу, вы сможете привлечь внимание людей в GCC-земле.

Я делаю что-то не так с версией C?

Нет, это совершенно хороший стандарт C. очень читаемый и идиоматический, на самом деле.

-121--2702149-

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

select month(now());
7
ответ дан 29 November 2019 в 01:30
поделиться

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

SELECT * 
FROM table 
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
3
ответ дан 29 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: