Jas*_*son 25 mysql date gaps-and-islands
我有一个用户数据库.我想基于用户群增长创建一个图表.我现在的查询是:
SELECT DATE(datecreated), count(*) AS number FROM users
WHERE DATE(datecreated) > '2009-06-21' AND DATE(datecreated) <= DATE(NOW())
GROUP BY DATE(datecreated) ORDER BY datecreated ASC
Run Code Online (Sandbox Code Playgroud)
这几乎返回了我想要的东西.如果我们有一天获得0个用户,则该日期不会返回为0值,只会跳过该值,并且会返回至少有一个用户的第二天.我怎样才能得到类似的东西(伪造的反应):
date1 5
date2 8
date3 0
date4 0
date5 9
etc...
Run Code Online (Sandbox Code Playgroud)
零日期与其他日期按顺序显示?
谢谢!
Igo*_*sov 15
我希望你能弄明白其余的.
select * from (
select date_add('2003-01-01 00:00:00.000', INTERVAL n5.num*10000+n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) as date from
(select 0 as num
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) n1,
(select 0 as num
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) n2,
(select 0 as num
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) n3,
(select 0 as num
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) n4,
(select 0 as num
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) n5
) a
where date >'2011-01-02 00:00:00.000' and date < NOW()
order by date
Run Code Online (Sandbox Code Playgroud)
同
select n3.num*100+n2.num*10+n1.num as date
Run Code Online (Sandbox Code Playgroud)
你会得到一个数字从0到最大(n3)*100 +最大(n2)*10 +最大(n1)的列
由于这里我们将max n3设为3,SELECT将返回399,加上0 - > 400条记录(日历中的日期).
您可以通过限制它来调整动态日历,例如,从现在的最小(日期)().
这样做更好:
-- 7 Days:
set @n:=date(now() + interval 1 day);
SELECT qb.day_series as days , COALESCE(col_byte, 0) as Bytes from tbl1 qa
right join (
select (select @n:= @n - interval 1 day) day_series from tbl1 limit 7 ) as qb
on date(qa.Timestamp) = qb.day_series and
qa.Timestamp > DATE_SUB(curdate(), INTERVAL 7 day) order by qb.day_series asc
-- 30 Days:
set @n:=date(now() + interval 1 day);
SELECT qb.day_series as days , COALESCE(col_byte, 0) as Bytes from tbl1 qa
right join (
select (select @n:= @n - interval 1 day) day_series from tbl1 limit 30 ) as qb
on date(qa.Timestamp) = qb.day_series and
qa.Timestamp > DATE_SUB(curdate(), INTERVAL 30 day) order by qb.day_series asc;
Run Code Online (Sandbox Code Playgroud)
或者没有像这样的变量:
SELECT qb.day_series as days , COALESCE(col_byte, 0) as Bytes from tbl1 qa
right join (
select curdate() - INTERVAL a.a day as day_series from(
select 0 as a union all select 1 union all select 2 union all
select 3 union all select 4 union all
select 5 union all select 6 union all select 7
) as a ) as qb
on date(qa.Timestamp) = qb.day_series and
qa.Timestamp > DATE_SUB(curdate(), INTERVAL 7 day) order by qb.day_series asc;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26230 次 |
| 最近记录: |