MySQL:查询中从周数开始的周日期范围

时间:2010-09-14 08:52:15

标签: sql mysql date

我有一个看起来像这样的数据库表:

| id         | clock         | info
----------------------------------------------
| 1          | 1262556754    | some info
| 2          | 1262556230    | some other info
| 3          | 1262556988    | and another
| 4          | 1262555678    | and some more

当写入此日志时,它包含日志记录和unix时间戳。我需要的是每周报告一次,每周有多少日志记录。这是我写的一个查询:

SELECT
    DATE_FORMAT(FROM_UNIXTIME(clock), "%U") AS week
count(*) as cnt
FROM logs
WHERE DATE_FORMAT(FROM_UNIXTIME(clock), "%Y") = '2010'
GROUP BY week

这给出了这样的结果:

| week       | cnt
-------------------------------
| 1           | 55 
| 2           | 134   
| 4           | 765
| 20          | 65

大!但我想看到的是日期范围如08 Feb 2010 00:00 - 15 Feb 2010 00:00,所以我的结果集看起来像这样:

| day_start           | day_end           | cnt
---------------------------------------------------------
| 08 Feb 2010 00:00   | 15 Feb 2010 00:00 | 55 
| 15 Feb 2010 00:00   | 22 Feb 2010 00:00 | 76
| 22 Feb 2010 00:00   | 01 Mar 2010 00:00 | 756

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:6)

使用STR_TO_DATE('201008 Monday', '%X%V %W');获取2010-02-22之类的正确日期,然后使用DATE_FORMAT获取所需格式。

答案 1 :(得分:3)

如果该“周”列存储一年内给定周数,您只需使用makedate函数将其转换为日期字符串。

E.g:

select makedate(2010, week * 7);

它应该有效,因为您的报告是针对特定年份的。 干杯

答案 2 :(得分:0)

我会简单地选择您的 day_start,然后按它分组。

如果您将星期日视为一周的第一天,则减去 DAYOFWEEK() - 1 以获得最近的星期日。然后再加上 6 天以获得下一个星期六。这就是你的日期范围:

SELECT
  DATE(FROM_UNIXTIME(clock) - INTERVAL DAYOFWEEK(FROM_UNIXTIME(clock)) - 1 DAY) AS day_start,
  (SELECT day_start) + INTERVAL 6 DAY AS day_end
  COUNT(*) as cnt
FROM logs
GROUP BY day_start