MySQL только в текущем месяце?

У меня есть следующий запрос MySQL, и я пытаюсь настроить его так, чтобы он извлекал результаты только в текущем месяце (текущего года), я предполагаю, что вам может потребоваться дополнительная информация о моей структуре MySQL, так что вот оно - У меня есть временная метка UNIX, сгенерированная PHP time(), хранящаяся в столбце time (под таблицей referrals), поэтому с приведенной ниже настройкой это будет t2.time.

Итак, моя проблема в том, что я не знаю, как действовать дальше, я предполагаю, что это будет что-то вроде добавления следующего в конец предложения WHERE? => AND t2.time IS WITHIN THE CURRENT MONTH (заглавные буквы нужны только для того, чтобы отличить проблему от остальной части запроса) но я не уверен, как проверить, относится ли она к текущему месяцу.

Запрос MySQL:

SELECT t1.username,
       t1.website,
       SUM(IF(t2.type = 'in', 1, 0))  AS in_count,
       SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM   users AS t1
       JOIN referrals AS t2
         ON t1.username = t2.author
WHERE  t1.website != ''
GROUP  BY t1.username,
          t1.website
ORDER  BY in_count DESC 
LIMIT  0, 10 

Ценю всю помощь! :Б


person newbtophp    schedule 11.01.2011    source источник
comment
Знаете ли вы, что тип данных time не хранит данные о годе и месяце? что означает, что ваше приложение столкнется с проблемами в 2012 году   -  person ajreal    schedule 11.01.2011
comment
@ajreal Я не уверен, что понимаю вас, но тип INT внутри db, и это временная метка UNIX, сгенерированная PHP time().   -  person newbtophp    schedule 11.01.2011
comment
так это не тип данных time?, мой плохой, любой ценой избегайте использования зарезервированных ключевых слов в качестве столбца или таблицы   -  person ajreal    schedule 11.01.2011
comment
@ajreal нет, это не время типа данных, спасибо, хотя я думаю, что могу легко изменить имя столбца (чтобы избежать проблем с зарезервированными ключевыми словами) - поскольку приложение все еще находится в разработке (поэтому еще не общедоступно / не работает). :)   -  person newbtophp    schedule 11.01.2011


Ответы (6)


вы можете использовать from_unixtime, например

date_format(from_unixtime(t2.`time`), '%Y-%m')=date_format(now(), '%Y-%m')

Но я думаю, что тип данных integer не очень подходит для этого требования

Я думаю, что использование datetime будет более подходящим, построил индекс для этого столбца, и это также упростит фильтрацию, например

t2.`time`>='2011-01-01' and t2.`time`<'2011-02-01'

or

date_format(t2.`time`, '%Y-%m')=date_format(now(), '%Y-%m')
person ajreal    schedule 11.01.2011

Вам необходимо ограничить результаты, используя YEAR() и MONTH() функции. Измените часть WHERE вашего запроса следующим образом:

WHERE t1.website != ''
AND YEAR(time) = YEAR(NOW())
AND MONTH(time) = MONTH(NOW())
person Anax    schedule 11.01.2011
comment
использование этого в сочетании с from_unixtime() сработало для меня (чтобы получить данные за предыдущий месяц) - person Andrew; 26.08.2015
comment
Плохо: будет вычислять МЕСЯЦ() для каждой строки. Лучше попробуйте сравнение диапазонов на столбце. - person Martian2049; 29.08.2018
comment
stackoverflow.com/questions/11808232/ - person Martian2049; 29.08.2018
comment
выберите * из t.stuff, где дата между DATE_FORMAT(NOW(),%Y-%m-01) и LAST_DAY(NOW()); - person Martian2049; 29.08.2018

Вероятно, это намного проще, чем вы ожидаете.

SELECT t1.username,
       t1.website,
       SUM(IF(t2.type = 'in', 1, 0))  AS in_count,
       SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM   users AS t1
       JOIN referrals AS t2
         ON t1.username = t2.author
WHERE  t1.website != ''
       AND t2.time >= DATE_SUB( CURRENT_DATE, INTERVAL 1 DAY )
GROUP  BY t1.username,
          t1.website
ORDER  BY in_count DESC 
LIMIT  0, 10 
person Ryan Gooler    schedule 11.01.2011

where t2.time >= extract(YEAR_MONTH from CURRENT_DATE) 
  and t2.time <  extract(YEAR_MONTH from CURRENT_DATE + INTERVAL 1 MONTH)

Это предполагает, что t2.time является типом даты и времени. Если это целочисленная отметка времени unix, вы можете преобразовать верхнюю и нижнюю границы даты и времени, которые мы создали, с помощью функции UNIX_TIMESTAMP().

person goat    schedule 11.01.2011

Для повышения производительности (--> используйте индекс) создайте индекс в столбце даты и используйте «между» в предложении where.

select ... from my_table where my:date_field between concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01')
and adddate(concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01'), interval 1 month);
person Cedric Simon    schedule 06.06.2017

Проверьте эту функцию MONTH в MySql.

Вы можете добавить условие, например MONTH( FROM_UNIXTIME( t2.time ) ) = Month(NOW())

Отредактировано после получения помощи в комментариях от fireeyedboy.

person Sachin Shanbhag    schedule 11.01.2011
comment
Разве функция МЕСЯЦ не требует, чтобы пареметр/аргумент был датой MySQL (а не временной меткой UNIX) - (если я не понял/не понял)? - person newbtophp; 11.01.2011
comment
@newbtophp - Да, ты прав. Я предполагаю, что t2.time является полем dateTime в mysql, иначе невозможно определить месяц только по значению времени. - person Sachin Shanbhag; 11.01.2011
comment
используйте 1_ - person Decent Dabbler; 11.01.2011
comment
... как ajreal, упомянутый в его ответе: stackoverflow.com/questions/4654961/ лол. Я должен был сначала просмотреть все ответы. ;-) - person Decent Dabbler; 11.01.2011