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.