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 

Цените всю помощь!: В

Ответ 1

вы можете использовать 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'

или

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

Ответ 2

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

WHERE t1.website != ''
AND YEAR(time) = YEAR(NOW())
AND MONTH(time) = MONTH(NOW())

Ответ 3

Это, вероятно, намного более прямолинейно, чем вы ожидаете.

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 

Ответ 4

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

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

Ответ 5

Для улучшения производительности (- > используйте индекс) создайте индекс в столбце даты и пользователь "между" в своем предложении 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);

Ответ 6

Отметьте эту функцию MONTH в MySql.

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

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