MySQL只在当月内?

时间:2011-01-11 06:53:08

标签: mysql aggregate-functions

我有以下MySQL查询,我正在尝试调整它,因此它只获取当前月份(当前年份)内的结果,我猜你可能需要更多关于我的MySQL结构的信息所以在这里 - 我有一个由time()time列(referrals表)中存储的PHP t2.time生成的UNIX时间戳,所以使用下面的设置它将是WHERE

所以我的问题是我不确定如何继续,我猜这会像在AND t2.time IS WITHIN THE CURRENT MONTH子句的末尾添加以下内容? => 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 (仅限于将问题与其他查询区分开来)但我不确定如何检查它是否在当月内。

MySQL查询:

{{1}}

感谢所有帮助! :乙

6 个答案:

答案 0 :(得分:66)

您需要使用YEAR()MONTH() functions来限制结果。像这样更改查询的WHERE部分:

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

答案 1 :(得分:14)

您可以使用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 :(得分:2)

这可能比你期望的要简单得多。

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 

答案 3 :(得分:2)

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()函数转换我们创建的上下日期时间边界。

答案 4 :(得分:0)

为了获得更好的表现( - >使用索引),请在日期列上创建一个索引,并在&#34;之间使用&#34;在你的where子句中。

String hgsv = "BRAF.p:V600E";
String[] tokens = hgsv.split(".");
this.symbol = tokens[0];
String type = tokens[1].split(":")[0];

答案 5 :(得分:-1)

检查MySql中的MONTH函数。

您可以添加MONTH( FROM_UNIXTIME( t2.time ) ) = Month(NOW())

等条件

fireeyedboy 的评论中获得帮助后编辑。