选择所有日期时间的数据

时间:2016-01-11 21:11:04

标签: mysql node.js datetime

我目前有两个查询,一个显示所有数据(不论时间),另一个查询时间范围。我试图将这些内容压缩在一起,并且想知道mysql是否有针对dateTimes的东西,它们充当了" allTime"变量,即插入时:
select count(*) from table where (color = "red") and (dateMade between "allTime" and "allTime");
对于表中的所有行,将显示颜色为红色的行数。我想到的一个解决方案是使用最小日期0000-01-01 00:00:00和一些大的结束日期,但如果已经有一些东西可以解决这个问题,我想我也可以使用它。 />

编辑:这不仅仅用于上面的示例查询,大多数更长,更复杂。目的是将它与节点结合起来使函数更简单,而不必考虑所有数据的特殊情况,而只是使用时间帧查询并根据作为参数给出的边界返回所有数据

3 个答案:

答案 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")