MySQL獲取周、月、天日期,生成排序號


  • 常用MySQL生成時間序列

  --生成最近七天的日期,不包括當天

  SELECT @cdate := date_add(@cdate, interval - 1 day) as date FROM(SELECT @cdate := date_add(date_sub(CURDATE(),interval 1 DAY), interval + 1 DAY) from resource_publish) t0 LIMIT 7;    

2020-06-16
2020-06-15
2020-06-14
2020-06-13
2020-06-12
2020-06-11
2020-06-10

  --生成最近七天的日期,包括當天

  SELECT @cdate := date_add(@cdate, interval - 1 day) as date_str FROM(SELECT @cdate := date_add(CURDATE(), interval + 1 DAY) from resource_publish) t0 LIMIT 7;

2020-06-17
2020-06-16
2020-06-15
2020-06-14
2020-06-13
2020-06-12
2020-06-11

  --生成最近七天的日期,包括當天

  SELECT @cdate := date_add(@cdate, interval - 1 day) as date_str FROM(SELECT @cdate := date_add('202006017', interval + 1 DAY) from resource_publish) t0 LIMIT 7;

2020-06-17
2020-06-16
2020-06-15
2020-06-14
2020-06-13
2020-06-12
2020-06-11

  --生成十二天每月的日期,包括當月

  SELECT @cdate := date_add(@cdate, interval - 1 MONTH) as date_str FROM(SELECT @cdate := date_add(CURDATE(), interval + 1 MONTH) from resource_publish) t0 LIMIT 12;

2020-06-17
2020-05-17
2020-04-17
2020-03-17
2020-02-17
2020-01-17
2019-12-17
2019-11-17
2019-10-17
2019-09-17
2019-08-17
2019-07-17

  -- 查詢最近七個月每月日期

  SELECT @cdate := date_add(@cdate, interval - 1 MONTH) as daytime FROM(SELECT @cdate := date_add(date_sub(CURDATE(),interval 1 MONTH), interval + 1 MONTH) from test_tb) t0 LIMIT 7;

2020-05-17
2020-04-17
2020-03-17
2020-02-17
2020-01-17
2019-12-17
2019-11-17

  -- 查詢最近六個月每月月末日期

  SELECT @lastDay := last_day( date_add(@lastDay,interval 1 month )) lastDays from (SELECT @lastDay := date_add(curdate(),interval -6 month) from test_tb limit 6) a;

2020-01-31
2020-02-29
2020-03-31
2020-04-30
2020-05-31
2020-06-30

  -- 查詢最近七月的月份

  SELECT date_format(@lastDay := last_day( date_add(@lastDay,interval 1 month ) ) ,'%Y-%m' ) lastDays from (SELECT @lastDay := date_add(curdate(),interval -6 month) from test_tb limit 6) a;

2020-01
2020-02
2020-03
2020-04
2020-05
2020-06

  -- 獲取當年所有月份

  SELECT date_format(@lastDay := last_day(date_add(@lastDay,interval 1 month)) ,'%Y-%m') lastDays from (SELECT @lastDay := date_add(curdate(),interval -MONTH(curdate()) month) from test_tb LIMIT 12) a;

  -- 獲取當年所有月份

  SELECT CASE WHEN length(mon) = 1 THEN concat(LEFT (CURRENT_DATE, 5),'0',mon)  ELSE concat(LEFT(CURRENT_DATE, 5), mon) END months FROM (SELECT @m :=@m + 1 mon FROM test_tb,(SELECT @m := 0) a) aa LIMIT 12;

2020-01
2020-02
2020-03
2020-04
2020-05
2020-06
2020-07
2020-08
2020-09
2020-10
2020-11
2020-12

  --生成當年十二個月

SELECT CONCAT(YEAR(CURRENT_DATE()),'-01') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-02') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-03') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-04') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-05') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-06') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-07') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-08') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-09') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-10') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-11') AS date UNION
SELECT CONCAT(YEAR(CURRENT_DATE()),'-12') AS date

  -- 獲取當年第一個月份

  SELECT date_format(date_sub(date_sub(curdate(),interval day(curdate()) - 1 day),interval MONTH(CURDATE())-1 month),'%Y-%m');

2020-01

  -- 獲取時間字符串第一個月份

  SELECT date_format(date_sub(concat('2020-06', '-01'), interval MONTH(concat('2020-06', '-01'))-1 month), '%Y-%m')

  -- 上月月份

  select extract(YEAR_MONTH from date_add(NOW(), interval -1 month));      -- 202005
  -- 上年月份
  select extract(YEAR_MONTH from date_add(NOW(), interval -1 year));       --201906

   -- 查看最近兩周內的工作日

  SELECT * FROM(SELECT daystr,WEEKDAY(daystr) AS wd FROM(SELECT @cdate := date_add(@cdate, interval - 1 day) as daystr FROM(SELECT @cdate := date_add(date_sub(CURDATE(),interval 1 DAY), interval + 1 DAY) from tb_name ) t0 LIMIT 14) ds) aa WHERE wd!='5' AND wd!='6';

1    2020-06-16
0    2020-06-15
4    2020-06-12
3    2020-06-11
2    2020-06-10
1    2020-06-09
0    2020-06-08
4    2020-06-05
3    2020-06-04
2    2020-06-03

  set @rownum=0; select @rownum:=@rownum+1 as rownum;select (@i:=@i+1) as rownum FROM (select @i:=0) as rn;      -- 和其他列組合自動生成序號 

  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 35 DAY);      -- 獲取六周前的周一:2020-05-11

  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 0 DAY);      -- 獲取當前周所在的周一:2020-06-15

  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) - 6 DAY);    -- 獲取當前周所在的周日:2020-06-021

  SELECT date_add(DATE_ADD(curdate(),interval -day(curdate())+1 day),interval -6 month);   -- 獲取六個月前第一天:2019-12-01

  SELECT DATE_ADD(curdate(),interval -day(curdate())+1 day);        -- 獲取當月第一天:2020-06-01

  • WEEK(date[,mode])函數

  此函數返回日期的周數。雙參數的形式WEEK()允許你指定星期是否開始於周日或周一,以及是否返回值應在范圍從0到53或從1到53。 如果省略了mode參數,系統default_week_format變量的值被使用。

  SELECT WEEK(‘2020-06-17’,1);    --當前日期是第:25 周

  • WEEKOFYEAR(date)

  返回日期用數字表示的范圍是從1到53的日歷周。WEEKOFYEAR()是一個兼容性函數,它等效於WEEK(date,3)。

  SELECT WEEKOFYEAR('2020-06-17');    --當前日期是第:25 周

  • YEARWEEK

  YEARWEEK 是獲取年份和周數的一個函數,函數形式為 YEARWEEK(date[,mode])

  SELECT YEARWEEK('2020-06-17');      -- 當前日期是第:202024

  date_format(date,'%u')
  %U 周 (01-53) 星期日是一周的第一天
  %u 周 (01-53) 星期一是一周的第一天

  • DAYOFWEEK

  DAYOFWEEK 轉換日期為周幾的函數,1 = Sunday, 2 = Monday, 3 = Tuesday, 4 = Wednesday, 5 = Thursday, 6 = Friday, 7 = Saturday

  select DAYOFWEEK('2020-06-17');      -- 周三為 4

  SELECT dayofweek(now());          -- 查看當日是周幾

  --當年第一天: 2020-01-01
  select date_sub(curdate(),interval dayofyear(now())-1 day);

  --當年第一天: 2020-01-01 
  select concat(date_format(last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-6 month),'%y-%m-'),'01');

  --當年最后一天: 2020-12-31
  SELECT concat(YEAR(now()),'-12-31');


  --當前week的第一天: 2020-06-14
  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 1 DAY);

  --當前week的最后一天: 2020-06-20
  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) - 5 DAY);

  --前一week的第一天: 2020-06-07
  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 8 DAY);

  --前一week的最后一天: 2020-06-13
  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 2 DAY);

  --前兩week的第一天: 2020-05-31
  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 15 DAY);

  --前兩week的最后一天: 2020-06-06
  select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 9 DAY);

  select curdate();                --獲取當前日期

  select date_sub(curdate(),interval 1 day);     -- 獲取前一天日期

  select last_day(curdate());             --獲取當月最后一天:2020-06-30

  select last_day(now());              -- 當前月的最后一天:2020-06-30

  -- 當前月的最后一天:2020-06-30 
  select last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-1 month); 

  select DATE_ADD(curdate(),interval -day(curdate())+1 day);          --獲取本月第一天:2020-06-01

  select date_add(curdate(), interval - day(curdate()) + 1 day);         --獲取本月第一天:2020-06-01

  select concat(date_format(last_day(now()),'%y-%m-'),'01');           --當前月的第一天: 2020-06-01 

  select extract(YEAR_MONTH from date_add(NOW(), interval -1 month));    --獲取上月月份:202005

  -- 上月第一天:2020-05-01
  select date_sub(date_sub(date_format(now(),'%Y-%m-%d'),interval extract(day from now())-1 day),interval 1 month);
  SELECT date_sub(date_sub(curdate(),interval day(curdate()) - 1 day),interval 1 month);

  --上月第一天:2020-05-01 
  select concat(date_format(last_day(now() - interval 1 month),'%y-%m-'),'01'); 

  -- 獲取上月月份:2020-05
  SELECT date_format(date_sub(date_sub(curdate(),interval day(curdate()) - 1 day),interval 1 month),'%Y-%m');

  select date_format(date_add(curdate(),interval -1 month),'%Y-%m');

  --獲取當年1月份:2020-01

  select date_format(date_sub(date_sub(curdate(),interval day(curdate()) - 1 day),interval month(curdate())-1 month),'%Y-%m');

  -- 獲取下個月的第一天:2020-07-01
  select date_add(curdate()-day(curdate())+1,interval 1 month); 

  --獲取當前月的天數:30
  select DATEDIFF(date_add(curdate()-day(curdate())+1,interval 1 month ),DATE_ADD(curdate(),interval -day(curdate())+1 day)) from dual;  

  --兩月第一天: 2020-04-01
  select concat(date_format(last_day(now() - interval 2 month),'%y-%m-'),'01'); 

  --兩月第一天: 2020-04-01  
  select concat(date_format(last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-3 month),'%Y-%m-'),'01');  

  --上月最后一天: 2020-05-31 
  select last_day(now() - interval 1 month); 

  --上兩月最后一天: 2020-04-30 
  select last_day(now() - interval 2 month);

  --上兩月最后一天: 2020-04-30 
  select last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-3 month); 

  --上兩月最后一天: 2020-04-30  
  select last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-3 month);

  -- MySQL 查詢百分占比三種方式:1.字段里嵌套子查詢統計總數,2.嵌套臨時表統計總數,3.設置臨時變量統計總數

  set @sum=(select sum(ct_col) from test_tb);

  select ct_col,round((ct_col/@sum*100),2) as ct from test_tb group by ct_col order by ct desc;

  •  MySQL時間格式化:  %Y-%m-%d %H:%i:%s.%f
  SELECT DATE_FORMAT('2020-06-17 15:23:16.463','%Y-%m-%d %H:%i:%s.%f')
  2020-06-17 15:23:16.463000
  • MySQL判空函數:

  IFNULL(expr,expr)       處理如果字段為空,返回默認值,sum是統計求和,

  IFNULL(SUM(expr1),expr2)  是統計求和之后為空返回默認值

  SUM(IFNULL(expr1,expr2))  是判斷字段為空返回默認值再求和

  IF(expr1,expr2,expr3)      條件判斷,true是expr2,false是expr3,double不能直接比較

作者:Jason Zeng 於 2020-06-17
博客:http://www.cnblogs.com/zengming/
GItHub:https://github.com/lovelifeming
嚴正聲明:
1.由於本博客部分資源來自互聯網,版權均歸原作者所有。轉載的目的是用於學術交流與討論學習,將不對任何資源負法律責任。
2.若無意中侵犯到您的版權利益,請來信聯系我,我會在收到信息后會盡快給予處理!
3.所有資源內容僅供學習交流之用,請勿用作商業用途,謝謝。
4.如有轉發請注明出處,來源於http://www.cnblogs.com/zengming/,謝謝合作。


免責聲明!

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



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