MySQL是否仅在本月内?

MySQL是否仅在本月内?,mysql,aggregate-functions,Mysql,Aggregate Functions,我有下面的MySQL查询,我正在尝试对其进行调整,使其只获取当月(今年)内的结果,我猜您可能需要有关我的MySQL结构的更多信息,所以现在开始-我有一个由PHP的time()生成的UNIX时间戳,存储在time列中(在转诊表下),因此使用下面的设置将是t2.time 所以我的问题是我不确定如何继续,我猜这就像在WHERE子句的末尾添加以下内容一样?=>和t2。时间在当月内(大写只是为了将问题与查询的其他部分区分开来),但我不确定如何检查它是否在当月内 MySQL查询: SELECT t1.use

我有下面的MySQL查询,我正在尝试对其进行调整,使其只获取当月(今年)内的结果,我猜您可能需要有关我的MySQL结构的更多信息,所以现在开始-我有一个由PHP的
time()
生成的UNIX时间戳,存储在
time
列中(在
转诊
表下),因此使用下面的设置将是
t2.time

所以我的问题是我不确定如何继续,我猜这就像在
WHERE
子句的末尾添加以下内容一样?=>
和t2。时间在当月内(大写只是为了将问题与查询的其他部分区分开来),但我不确定如何检查它是否在当月内

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 

感谢所有帮助!:B

这可能比您预期的要简单得多

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 
在MySql中检查此函数

您可以添加如下条件:
MONTH(FROM_UNIXTIME(t2.time))=MONTH(NOW())


从fireeyedboy获得评论帮助后进行编辑

您需要使用和来限制结果。将查询的
WHERE
部分更改如下:

WHERE t1.website != ''
AND YEAR(time) = YEAR(NOW())
AND MONTH(time) = MONTH(NOW())
你可以用like

但是我认为数据类型
integer
不太适合这个要求

我认为使用
datetime
会更合适,在这个列上建立一个索引,这也会使过滤更容易,比如

t2.`time`>='2011-01-01' and t2.`time`<'2011-02-01'
其中t2.time>=提取(从当前日期算起的年/月)
和t2.时间<提取(从当前日期算起的年/月+间隔1个月)
假设t2.time是datetime类型。如果它是一个整数unix时间戳,您可以使用unix_timestamp()函数转换我们创建的上下日期时间边界。

要获得更好的性能(->使用索引),请在日期列上创建一个索引,并在where子句中使用“between”

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);

MONTH函数不要求参数/参数是MySQL日期(而不是UNIX时间戳)吗?(除非我误解了/误读了)@newtopHP-是的,你是对的。我假设t2.time是MySQL中的一个日期时间字段,否则无法仅从时间值确定月份。使用
MONTH(from_UNIXTIME(你的_时间戳))
…就像ajreal在回答中提到的那样:哈哈。我应该先看看所有的答案;-)你知道数据类型
时间
不存储年+月的详细信息吗?这意味着您的应用程序将在一年内遇到麻烦2012@ajreal我不确定我是否理解您的意思,但db中的类型是INT,它是由PHP的time()生成的UNIX时间戳。因此,数据类型不是
time
?,我的缺点是,无论如何,避免使用保留关键字作为列或table@ajreal不,它不是数据类型时间,谢谢,不过我想我可以很容易地更改列名(以避免保留关键字问题)-因为应用程序仍在开发中(所以还不是公共/实时的)。:)结合使用from_unixtime()对我来说很有效,(获取上个月的数据)坏:将计算每行的月份()。最好尝试在列上进行范围比较。从t.stuff中选择*,其中日期介于日期格式(NOW(),%Y-%m-01)和最后一天(NOW())之间;
date_format(t2.`time`, '%Y-%m')=date_format(now(), '%Y-%m')
where t2.time >= extract(YEAR_MONTH from CURRENT_DATE) 
  and t2.time <  extract(YEAR_MONTH from CURRENT_DATE + INTERVAL 1 MONTH)
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);