MYSQL查詢今天,昨天,這個周,上個周,這個月,上個月,今年,去年的數據


一般后台做報表什么的,可能會用到

createTime ---- 創建時間, 就是你要對比的時間,表的字段類型為 datetime

直接上代碼

-- 查詢上周的數據 
-- SELECT count(id) as count FROM user WHERE YEARWEEK(date_format(createTime,'%Y-%m-%d')) = YEARWEEK(now())-1; 
-- 查詢這個周的數據
-- SELECT count(id) as count FROM user WHERE YEARWEEK(date_format(createTime,'%Y-%m-%d')) = YEARWEEK(now())
-- 查詢上個月的數據 
-- select count(id) as count from user where date_format(createtime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m') 
-- 查詢這個月的數據 
-- 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') ; 
-- 查詢距離當前現在6個月的數據 
-- select count(id) as count from user where createtime between date_sub(now(),interval 6 month) and now(); 
-- 查詢今天的數據
-- SELECT count(id) as count FROM user WHERE date_format(createtime,'%Y-%m-%d')=date_format(now(),'%Y-%m-%d');
-- 查詢昨天的數據
-- 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;
-- 來一發集合的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

統計當前月,后12個月,各個月的數據

下面是創建對照視圖 sql

CREATE
    ALGORITHM = UNDEFINED 
    DEFINER = `tyro`@`%` 
    SQL SECURITY DEFINERVIEW `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`

然后和你想要統計的表進行關聯查詢,如下的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

順便把我上次遇到的一個排序小問題也寫出來

數據表有一個sort_num 字段來代表排序,但這個字段有些值是null,現在的需求是,返回結果集按升序返回,如果sort_num 為null 則放在最后面mysql null 默認是最小的值,如果按升序就會在前面.

解決方法:

SELECT * from table_name 
ORDER BY 
  case WHEN 
  sort_num is null 
  then 
    1 
  else 0 end, sort_num asc

再寫一個吧

case when 統計個數

SELECT 
    count(*) as total,
    sum(case when a.notice_type='praise' THEN 1 else 0 end) as praiseNum,
    sum(case when a.notice_type='concern' THEN 1 else 0 end) as concernNum,
    sum(case when a.notice_type='letter' THEN 1 else 0 end) as letterNum,
    sum(case when a.notice_type='comment' THEN 1 else 0 end) as commentNum
FROM
    blog_notice a

小數點不夠自動補零

1、FORMAT

# 第二個參數是 保留幾位小數 ,---> '12,332.1235'
SELECT FORMAT(12332.123456, 4);

2、truncate

# 輸出 ---->4545.13
select truncate(4545.1366,2);

3、convert

# 第二個參數可以填有很多類型,DECIMAL(15,2) 中的2 是兩位小數點
select convert(15645.1246,DECIMAL(15,2));

字符串拼接

1、concat

select concat('¥',8898898.15) as RMB

# 查詢
a.name LIKE CONCAT(CONCAT('%', #{keyword}),'%')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM