一般后臺做報表什么的,可能會用到
createTime ---- 創(chuàng)建時間, 就是你要對比的時間,表的字段類型為 datetime
直接上代碼
-- 查詢上周的數(shù)據(jù)
-- SELECT count(id) as count FROM user WHERE YEARWEEK(date_format(createTime,'%Y-%m-%d')) = YEARWEEK(now())-1;
-- 查詢這個周的數(shù)據(jù)
-- SELECT count(id) as count FROM user WHERE YEARWEEK(date_format(createTime,'%Y-%m-%d')) = YEARWEEK(now())
-- 查詢上個月的數(shù)據(jù)
-- select count(id) as count from user where date_format(createtime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')
-- 查詢這個月的數(shù)據(jù)
-- SELECT count(id) as count FROM user WHERE date_format(createtime,'%Y-%m')=date_format(now(),'%Y-%m');
-- select count(id) as count from `user` where DATE_FORMAT(createtime,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') ;
-- 查詢距離當(dāng)前現(xiàn)在6個月的數(shù)據(jù)
-- select count(id) as count from user where createtime between date_sub(now(),interval 6 month) and now();
-- 查詢今天的數(shù)據(jù)
-- SELECT count(id) as count FROM user WHERE date_format(createtime,'%Y-%m-%d')=date_format(now(),'%Y-%m-%d');
-- 查詢昨天的數(shù)據(jù)
-- SELECT * FROM user WHERE TO_DAYS(NOW())-TO_DAYS(createTime) = 1
-- 今年的
-- select * from `user` where YEAR(createTime)=YEAR(NOW());
-- 去年的
-- select * from `user` where YEAR(createTime)=YEAR(NOW())-1;
-- 來一發(fā)集合的
select
t1.count as toDay,
tt1.count as lastDay,
t2.count as lastWeek,
tt2.count as toWeek,
t3.count as lastMonth,
tt3.count as toMonth,
t4.count as toYear,
tt4.count as lastYear,
t.count as total
from
(SELECT count(id) as count FROM user WHERE date_format(createtime,'%Y-%m-%d')=date_format(now(),'%Y-%m-%d')) t1,
(SELECT count(id) as count FROM user WHERE TO_DAYS(NOW())-TO_DAYS(createTime) = 1) tt1,
(SELECT count(id) as count FROM user WHERE YEARWEEK(date_format(createTime,'%Y-%m-%d')) = YEARWEEK(now())-1) t2,
(SELECT count(id) as count FROM user WHERE YEARWEEK(date_format(createTime,'%Y-%m-%d')) = YEARWEEK(now())) tt2,
(select count(id) as count from user where date_format(createtime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')) t3,
(SELECT count(id) as count FROM user WHERE date_format(createtime,'%Y-%m')=date_format(now(),'%Y-%m')) tt3,
(select count(id) as count from `user` where YEAR(createTime)=YEAR(NOW())) t4,
(select count(id) as count from `user` where YEAR(createTime)=YEAR(NOW())-1) tt4,
(select count(id) as count from user) t
統(tǒng)計當(dāng)前月,后12個月,各個月的數(shù)據(jù)
下面是創(chuàng)建對照視圖
CREATE
ALGORITHM = UNDEFINED
DEFINER = `tyro`@`%`
SQL SECURITY DEFINER
VIEW `past_12_month_view` AS
SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 1 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 2 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 3 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 4 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 5 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 6 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 7 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 8 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 9 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 10 MONTH), '%Y-%m') AS `month`
UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 11 MONTH), '%Y-%m') AS `month`
然后和你想要統(tǒng)計的表進(jìn)行關(guān)聯(lián)查詢,如下的demo
select
v.month,
ifnull(b.minute,0) count
from
past_12_month_view v
left join
(select DATE_FORMAT(t.createTime,'%Y-%m') month,count(t.id) minute from user t group by month) b
on
v.month = b.month
group by
v.month
結(jié)果如下

QQ圖片20170418160557.png
順便把我上次遇到的一個排序小問題也寫出來
數(shù)據(jù)表有一個sort_num 字段來代表排序,但這個字段有些值是null,
現(xiàn)在的需求是
返回結(jié)果集按升序返回,如果sort_num 為null 則放在最后面
mysql null 默認(rèn)是最小的值,如果按升序就會在前面
解決方法
SELECT * from table_name
ORDER BY
case
WHEN
sort_num is null
then
1
else 0 end, sort_num asc