mysql 日期函數 按天,按周,按月,按年分組 統計數據


在工作業務中常會使用mysql的日期函數,下面做一下關於這方面的sql整理:

1.內置日期函數

  • now(): 返回當前的日期和時間
  • unix_timestamp(): 返回自1970-01-01 00:00:00到當前時間的秒數差(時間戳)
  • unix_timestamp(指定時間): 返回自1970-01-01 00:00:00到指定時間的秒數差(時間戳)
  • from_unixtim(時間字段): 將unix(時間戳)轉為datetime日期
  • date_format(時間字段, format): 以不同的格式顯示日期或時間數據

補充: 字符串截取函數

  • left('example.com', 3): exa, 從最左邊開始截取
  • right('example.com', 3): com, 從最右邊開始截取
  • substring('example.com', 4): mple.com,從第4個字符位置開始取,索引為1開始
  • substring('example.com', 4, 2): mp,從第四個字符位置開始取2個字符
  • substring('example.com', -4): .com,從右邊開始數第4個字符位置開始取
  • substring('example.com', -4, 2): .c,從右邊開始數第4個字符位置開始取2個
  • substring_index('www.example.com', '.', 2): www.example, 截取第二個 '.' 之前的所有字符
  • substring_index('www.example.com', '.', -2): example.com , 截取倒數第二個 '.' 之后的所有字符
  • substring_index('www.example.com', '.coc', 1): www.example.com, 沒有查找到指定的值就返回整個字符串

2.查詢每日,每周,每月,每季度,每年相關的sql語句

查詢2019年每天有多少條記錄:

select date_format(時間字段,'%Y-%m-%d') days,count(*) from 表名 where date_format(時間字段,'%Y')='2019' group by days
--或
select count(*),DATE(時間字段名) from 表名 where YEAR(時間字段名)='2019' group by DAY(時間字段名)

查詢8月份每周有多少條記錄:

select date_format(時間字段,'%Y%u') weeks,count(*) from 表名 where date_format(時間字段,'%m')='08' group by weeks
--或
select count(*),WEEK(時間字段名) from 表名 where MONTH(時間字段名)='8' group by WEEK(時間字段名) 

查詢2019年周一到周五每天總共有多少條記錄:

select count(*),DAYNAME(時間字段名) from 表名 where YEAR(時間字段名)='2019' group by DAYNAME(時間字段名)

查詢本周有多少條記錄:

select count(*) from 表名 where MONTH(時間字段名) = MONTH(CURDATE()) and WEEK(時間字段名) = WEEK(CURDATE())

查詢2019年每月有多少條記錄:

select date_format(時間字段,'%Y%m') months,count(*) from 表名 where date_format(時間字段,'%Y')='2019' group by months
--或
select count(*),MONTH(時間字段名) from 表名 where YEAR(時間字段名)='2019' group by MONTH(時間字段名)

查詢本月有多少條記錄:

select count(*) from 表名 where MONTH(時間字段名)=MONTH(CURDATE()) and YEAR(時間字段名) = YEAR(CURDATE())

查詢2019年每季度有多少條記錄:

select count(*), concat(year(時間字段),floor((date_format(時間字段, '%m')+2)/3)) quarters from 表名 group by quarters
--或
select count(*),QUARTER(時間字段名) from 表名 where YEAR(時間字段名)='2019' group by QUARTER(時間字段名)

查詢每年有多少條記錄:

select date_format(時間字段, '%Y') years,count(*) from 表名 group by years
--或
select count(*),YEAR(時間字段名) from 表名 group by YEAR(時間字段名)

3.時間段查詢

查詢當天的所有記錄:

select * from 表名 where date(時間字段名) = date(now())
--或
select * from 表名 where to_days(時間字段) = to_days(now())

查詢n天內所有記錄:

select * from 表名 where to_days(now()) - to_days(時間字段名) <= n

查詢一周內的所有記錄:

select * from 表名 where date_sub(curdate(), interval 7 day) <= date(時間字段名)

查詢一個月內的所有記錄:

select * from 表名 where date_sub(curdate(), interval 1 month) <= date(時間字段名)

查詢'08-06'到'12-12'時間端內所有記錄:

select * from 表名 where date_format(時間字段名,'%m-%d') >= '08-06' and date_format(時間字段名,'%m-%d') <= '12-12'

4.date_format()中format可以使用的格式

  • 格式 描述
  • %a 縮寫星期名
  • %b 縮寫月名
  • %c 月,數值
  • %D 帶有英文前綴的月中的天
  • %d 月的天,數值(00-31)
  • %e 月的天,數值(0-31)
  • %f 微秒
  • %H 小時(00-23)
  • %h 小時(01-12)
  • %I 小時(01-12)
  • %i 分鍾,數值(00-59)
  • %j 年的天(001-366)
  • %k 小時(0-23)
  • %l 小時(1-12)
  • %M 月名
  • %m 月,數值(00-12)
  • %p AM 或 PM
  • %r 時間,12-小時(hh:mm:ss AM 或 PM)
  • %S 秒(00-59)
  • %s 秒(00-59)
  • %T 時間, 24-小時(hh:mm:ss)
  • %U 周(00-53)星期日是一周的第一天
  • %u 周(00-53)星期一是一周的第一天
  • %V 周(01-53)星期日是一周的第一天,與 %X 使用
  • %v 周(01-53)星期一是一周的第一天,與 %x 使用
  • %W 星期名
  • %w 周的天(0=星期日, 6=星期六)
  • %X 年,其中的星期日是周的第一天,4 位,與 %V 使用
  • %x 年,其中的星期一是周的第一天,4 位,與 %v 使用
  • %Y 年,4 位
  • %y 年,2 位

參考鏈接:


免責聲明!

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



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