我有一个看起来像这样的数据库表:
| 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
有没有办法做到这一点?
答案 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