MySQL 求前兩天、前兩周、前兩個月(跨年)最后一天數據


2017-02-28

  一、要求:

  

  

  要求實現下面效果:

  二、實現步驟:

  1.創建中間過程表,包含字段如下:

  

  2.查詢資源表resource_storage_info數據依據時間放入中間表storage_usaged對應列中,代碼如下:

  更新今天數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,r.STORAGE_SIZE SIZ,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
  where r.CUST_INFO = c.PATH and day(STR_TO_DATE(r.DATE,'%Y-%m-%d')) = day(now()) group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_USED = d.SZE where s.USER_ID = d.UID,s.STORAGE_ALL = d.SIZ;

  更新昨天數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
  where r.CUST_INFO = c.PATH and day(STR_TO_DATE(r.DATE,'%Y-%m-%d')) = day(now())-1 group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_USED = d.SZE where s.USER_ID = d.UID;

  更新前天數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
  where r.CUST_INFO = c.PATH and day(STR_TO_DATE(r.DATE,'%Y-%m-%d')) = day(now())-2 group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_USED = d.SZE where s.USER_ID = d.UID;

  更新上周數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
  where r.CUST_INFO = c.PATH and STR_TO_DATE(r.DATE,'%Y-%m-%d') = (select date_sub(CURDATE(),INTERVAL WEEKDAY(CURDATE()) + 1 DAY))
    group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_LASTWEEK = d.SZE
  where s.USER_ID = d.UID;

  更新前2周數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
  where r.CUST_INFO = c.PATH and STR_TO_DATE(r.DATE,'%Y-%m-%d') = (select date_sub(CURDATE(),INTERVAL WEEKDAY(CURDATE()) + 8 DAY))
    group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_LASTWEEK = d.SZE
  where s.USER_ID = d.UID;

-------------------------------------------------------------------------------------------------------------------------------------------------------------

  如果前兩個月都是在本年,用下面的SQL語句:

+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

  更新上月數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
  where r.CUST_INFO = c.PATH and STR_TO_DATE(r.DATE,'%Y-%m-%d') = (select date_sub(date_sub(date_format(now(),'%y-%m-%d'),interval extract( day from now()) day),interval 0 month)) group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_LASTMONTH = d.SZE
  where s.USER_ID = d.UID;

  更新上2個月數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
    where r.CUST_INFO = c.PATH and STR_TO_DATE(r.DATE,'%Y-%m-%d') = (select CONCAT(date_format(LAST_DAY(now() - interval 2 month),'%Y-%m-'),'01')) group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_BEFORE_LASTMONTH = d.SZE
  where s.USER_ID = d.UID

+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

  若現在是1月,上個月是去年12月,上2個月是去年11月,使用下面SQL語句:

+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

  更新去年11月數據:

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
    where r.CUST_INFO = c.PATH and STR_TO_DATE(r.DATE,'%Y-%m-%d') = STR_TO_DATE(CONCAT(DATE_FORMAT(NOW(), '%Y')-1,'-11-30'),'%Y-%m-%d') group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_BEFORE_LASTMONTH = d.SZE
  where s.USER_ID = d.UID;

  更新去年12月數據: 

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
    where r.CUST_INFO = c.PATH and STR_TO_DATE(r.DATE,'%Y-%m-%d') = STR_TO_DATE(CONCAT(DATE_FORMAT(NOW(), '%Y')-1,'-12-31'),'%Y-%m-%d') group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_LASTMONTH = d.SZE
  where s.USER_ID = d.UID

+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

  若現在是2月,上2個月是去年12月,使用下面SQL語句:

+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

  update storage_usaged s inner join (select r.STORAGE_USAGE SZE,r.STORAGE_SIZE SIZ,c.USER_ID UID from resource_storage_info r,cfg_user_filepath c
    where r.CUST_INFO = c.PATH and STR_TO_DATE(r.DATE,'%Y-%m-%d') = STR_TO_DATE(CONCAT(DATE_FORMAT(NOW(), '%Y')-1,'-12-31'),'%Y-%m-%d') group by r.CUST_INFO) d on s.USER_ID = d.UID
  set s.STORAGE_BEFORE_LASTMONTH = d.SZE
  where s.USER_ID = d.UID

+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

  3.更新展示表storage_rate數據:

  update storage_rate r inner join (select user_id id,
  round((storage_used/1024)/1024,2) used,  --此字段是KB,保留兩位小數
  CONCAT(round((storage_used*100/storage_all),1),'%') used_rate,  
  CONCAT(ABS(round(((storage_yesterday-storage_before_yesterday)*100/storage_before_yesterday),1)),'%') day_rate,
  CONCAT(ABS(round(((storage_lastweek-storage_before_lastweek)*100/storage_before_lastweek),1)),'%') week_rate,
  CONCAT(ABS(round(((storage_lastmonth-storage_before_lastmonth)*100/storage_before_lastmonth),1)),'%') month_rate
  from storage_usaged group by user_id) s on r.user_id = s.id
  set r.storage_used = s.used,r.storage_used_rate = used_rate,r.prev_day_rate = day_rate,
  r.prev_week_rate = week_rate,r.prev_month_rate = month_rate,r.date = DATE_FORMAT(NOW(),'%Y-%m-%e %H:%i:%s')
  where r.user_id = s.id

  

  本人知識匱乏,歡迎留下更簡單的SQL語句和更好的方法......

 


免責聲明!

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



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