分组中的MySQL日期转换

时间:2014-05-08 18:39:55

标签: mysql sql datetime group-by

我有以下查询:

SELECT COUNT(*) AS COUNT, DATE(POST_DATE) AS POST_DATE 
FROM POST 
WHERE POST_DATE>='?' 
GROUP BY DATE(POST_DATE)

POST_DATE实际上是DATETIME

现在,此查询工作正常,但我想进行一次小调整。我希望早上6点之前的所有帖子都算作昨天的帖子。

所以我需要说:if POST_DATE.hour < 6 -> date(POST_DATE) - 1

但是我不确定在这个查询中如何做到这一点......或者如果可能的话。

我的第一个想法是用日期转换做另一个查询,然后用count和groupby包装该结果

来自SQL向导的任何想法?

2 个答案:

答案 0 :(得分:1)

SELECT COUNT(*) AS COUNT, case when hour(POST_DATE) >= 6
                               then DATE(POST_DATE)
                               else POST_DATE - interval 1 day
                          end AS NEW_POST_DATE 
FROM POST 
WHERE POST_DATE >= '?'
GROUP BY NEW_POST_DATE 

答案 1 :(得分:1)

您希望将第n + 1天早上6点之前的所有帖子制成表格,就像它们是从第n天开始一样。这意味着您希望将它们制成表格,就好像它们比实际时间戳早6小时制作。

这是你做的。

SELECT COUNT(*) AS COUNT, 
       DATE(POST_DATE - INTERVAL 6 HOUR) AS POST_DATE 
  FROM POST 
 WHERE DATE(POST_DATE - INTERVAL 6 HOUR) = ?
  GROUP BY DATE(POST_DATE - INTERVAL 6 HOUR)

在所有情况下,您只需将POST_DATE偏移六个小时。我假设当您选择特定日期的帖子时,您希望它从06:00到06:00,而不是午夜到午夜。

请注意,由于列值上的函数,WHERE子句会在POST_DATE上失败使用索引。你可能想要这个。

WHERE POST_DATE >= ? + INTERVAL 6 HOUR
  AND POST_DATE < ? + INTERVAL 1 DAY + INTERVAL 6 HOUR