我目前有两个查询,一个显示所有数据(不论时间),另一个查询时间范围。我试图将这些内容压缩在一起,并且想知道mysql是否有针对dateTimes的东西,它们充当了" allTime"变量,即插入时:
select count(*) from table where (color = "red") and (dateMade between "allTime" and "allTime");
对于表中的所有行,将显示颜色为红色的行数。我想到的一个解决方案是使用最小日期0000-01-01 00:00:00和一些大的结束日期,但如果已经有一些东西可以解决这个问题,我想我也可以使用它。 />
编辑:这不仅仅用于上面的示例查询,大多数更长,更复杂。目的是将它与节点结合起来使函数更简单,而不必考虑所有数据的特殊情况,而只是使用时间帧查询并根据作为参数给出的边界返回所有数据
答案 0 :(得分:1)
如果您不想限制数据,请使用NULL填充变量@from和/或@to。使用IFNULL检查是否适用限制。
select count(*)
from table
where color = @color
and datemade between ifnull(@from, datemade) and ifnull(@to, datemade);
答案 1 :(得分:1)
如果您不需要日期范围,则可以将where
条款的一部分作为真正的noop:
select ...
from tablename
where date_created between $start and $end or $start = $end
然后,如果您需要无界查询,只需将相同的$ start和$ end传递给它。
答案 2 :(得分:0)
select
count(*) all_count
, count(case when dateMade between @start and @end then id end) period_count
from table
where (color = "red")
获得"所有时间"你根本不按where子句中的日期范围进行过滤。
另请注意,COUNT()函数会增加它遇到的任何非空值,因此对于case表达式,它应该返回一个始终存在于行中的列,例如主键。
另一种方法是使用SUM(),就像这样
select
count(*) all_count
, sum(case when dateMade between @start and @end then 1 else 0 end) period_count
from table
where (color = "red")