SQL日期不相关

时间:2018-10-03 10:06:52

标签: mysql

我有一张表,其中每隔15分钟存储一次cron作业的结果,无非是时间戳,人口编号和ID。

我正在尝试按以下方式查询它。

SELECT ROUND(AVG(`population`),0) AS population, DATE(`time`) AS date
FROM `swg_servertracker`
WHERE `time` >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY DATE(`time`)
DESC
LIMIT 7

enter image description here

它执行的操作将创建每日平均值,并获取最近的7个条目。可悲的是,in的顺序不正确,所以我将其翻转为上升。我的问题是当我反向(asc时,它今天跳过,又返回了一天(今天是10月3日,当我使用升序时不在公式中)

我试图将where语句设置为现在-间隔168小时(也是7天,然后是相对时间),对此也没有任何结果。仍然今天跳过,仅从昨天返回7天。

SELECT ROUND(AVG(`population`),0) AS population, DATE(`time`) AS date 
FROM `swg_servertracker` 
WHERE `time` >= NOW() - INTERVAL 168 HOUR 
GROUP BY DATE(`time`) 
ASC 
LIMIT 7

Result is skipping today

那么我今天还有办法吗?

2 个答案:

答案 0 :(得分:3)

您选择8条记录,而不是7条记录。如果要选择7条最新记录,则必须使用“大于”符号代替“大于或等于”符号。

SELECT ROUND(AVG(`population`),0) AS population, DATE(`time`) AS date 
FROM `swg_servertracker` 
WHERE `time` > NOW() - INTERVAL 7 DAY
GROUP BY DATE(`time`) 
ASC 
LIMIT 7

答案 1 :(得分:0)

  • 您可以在Derived table中获得结果集,然后再次对结果进行排序。
  • 请注意,in MySQL,在Select子句中定义的别名可以在Group ByHavingOrder By子句中使用。因此,为了避免在DATE(time)Group by中重新计算,我为Order By加上了别名。

您可以改为:

SELECT dt.population, 
       dt.date1 AS date 
FROM (
      SELECT ROUND(AVG(`population`),0) AS population, 
             DATE(`time`) AS date1
      FROM `swg_servertracker`
      WHERE `time` >= DATE(NOW()) - INTERVAL 7 DAY
      GROUP BY date1 
      ORDER BY date1 DESC
      LIMIT 7
    ) AS dt 
ORDER BY dt.date1 ASC