一、時間函數
(一)、獲取當前時間
1、NOW()?
獲取當前日期和時間,在程序一開始執行便拿到時間
返回格式 YYYY-MM-DD hh:mm:ss
eg:
????????NOW() 得到 2023-12-03 12:20:02
????????NOW(),SLEEP(2),NOW() 得到??2023-12-03 12:20:02 | 0 | 2023-12-03 12:20:02
2、CURDATE()
獲取當前日期
返回格式YYYY-MM-DD
eg:
????????CURDATE() 得到 2023-12-03
3、CURTIME()
獲取當前時間
返回格式 hh:mm:ss
eg:
????????CURTIME() 得到 12:22:02
4、CURDATE()
返回當前日期,僅返回年月日
eg:
????????CURDATE() 得到?2023-12-05
5、CURRENT_DATE()
返回當前日期,僅返回年月日,與CURDATE()完全相同
eg:
????????CURRENT_DATE() 得到?2023-12-05
6、CURRENT_TIME()
返回當前時間,僅返回時分秒
eg:
????????CURRENT_TIME() 得到16:48:47
7、CURRENT_TIMESTAMP()
返回當前時間,僅返回時分秒,與CURRENT_TIME()完全相同
eg:
????????CURRENT_TIMESTAMP() 得到16:48:47
8、CURTIME()
返回當前時間,僅返回時分秒,與CURRENT_TIME、CURRENT_TIMESTAMP()完全相同
eg:
????????CURTIME() 得到16:48:47
9、MICROSECOND(expr)?
返回指定時間中的微妙部分
eg:
????????MICROSECOND('12:30:01.000666') 得到 666
10、UTC_DATE
返回當前UTC(世界標準時間)日期,默認YYYY-MM-DD格式或YYYMMDD
11、UTC_TIME
返回當前UTC(世界標準時間)時間,默認hh:mm:ss格式或hhmmss
12、UTC_TIMESTAMP()
返回當前UTC(世界標準時間)日期和時間,默認 YYYY-MM-DD hh:mm:ss格式或 YYYMMDDhhmmss
13、LOCALTIME()
返回當前時間,于NOW()完全相同
eg:
????????LOCALTIME() 得到?2023-12-06 10:51:02
14、SYSDATE()
返回當前時間,格式同NOW()相同,但不同的是NOW在程序執行開始就得到時間,但SYSDATE是在程序執行完畢之后才得到時間。
eg:
????????SYSDATE() 得到?2023-12-06 10:56:26
????????執行 sysdate(), sleep(3), sysdate(); 得到??2023-12-06 10:56:26 | 0 |? 2023-12-06 10:56:29
(二)、時間轉換、時間提取
1、DATE(date)
將字符串格式的時間轉為日期,
eg:
????????運行DATE('2023-12-03 12:20:02'),得到 2023-12-03;如果傳入的字符串中不包含日期,則返回null
2、YEAR(date)
?獲取傳入字符串格式日期中的年
eg:
????????YEAR('2023-12-03 12:20:02'),得到2023;如果傳入的字符串中不包含年,則返回null
傳入數據為時間格式時,使用該函數只會返回null;?
3、MONTH(date)
?獲取傳入字符串格式日期中的月
eg:
????????YEAR('2023-12-03 12:20:02'),得到12;如果傳入的字符串中不包含月,則返回null
傳入數據為時間格式時,使用該函數只會返回null;
4、DAY(date)?
獲取傳入字符串格式日期中的天
eg:
????????YEAR('2023-12-03 12:20:02'),得到03;如果傳入的字符串中不包含日,則返回null;
?傳入數據為時間格式時,使用該函數只會返回null;
5、HOUR(time)
? 獲取傳入字符串格式日期中的小時
eg:
????????YEAR('2023-12-03 14:20:02'),得到14;如果傳入的字符串中不包含小時,則返回null;
?傳入數據為時間格式時,使用該函數只會返回null;
6、MINUTE(time)
? 獲取傳入字符串格式日期中的分鐘
eg:
????????YEAR('2023-12-03 14:20:02'),得到20;如果傳入的字符串中不包含分鐘,則返回null;
?傳入數據為時間格式時,使用該函數只會返回null;
7、SECOND(time)
獲取傳入字符串格式日期中的秒
eg:
????????YEAR('2023-12-03 14:20:02'),得到2;如果傳入的字符串中不包含秒,則返回null;
?傳入數據為時間格式時,使用該函數只會返回null;
8、DAYNAME(date)
獲取傳入字符串格式日期對應的星期數,返回的是英文單詞
eg:?
????????DAYNAME('2023-12-04'),得到Monday;?傳入數據為時間格式時,使用該函數只會返回null;
9、MONTHNAME(date)
獲取傳入字符串格式日期對應的月份,返回的是英文單詞
eg:?
????????DAYNAME('2023-12-04'),得到 December ;?傳入數據為時間格式時,使用該函數只會返回null;
10、EXTRACT()
提取字符串中指定日期的時間成分
eg:
????????假設是獲取日期中的小時 EXTRACT(HOUR FROM '2023-12-04 14:02:30'),得到 14
11、 DATE_FORMAT(date,format)
?格式化時間的日期格式,date是日期字符串,format是指定的格式
eg:
????????DATE_FORMAT('2023-12-03','%Y%m%d') 得到20231203;
????????DATE_FORMAT('2023-12-03','%Y-%m-%d') 得到2023-12-03;
12、TIME_FORMAT(time,format)
?格式化時間的時間格式;date是時間字符串,format是指定的格式
eg:
????????DATE_FORMAT('2023-12-03 12:30:20','%Y%m%d %H:%i:%s') 得到00000000 12:30:20;
從示例可知,即便格式要求了年月日,這個函數也只會返回時分秒,年月日會被0填充
13、TIME_TO_SEC(time)
返回傳入時刻與零點的秒數差,多傳的年月日會被直接忽略掉
eg:
????????TIME_TO_SEC('00:00:01'),得到1
????????TIME_TO_SEC('2023-04-01 00:00:01'),得到1
????????TIME_TO_SEC(' 00:01'),得到60
14、YEARWEEK(date)
返回傳入日期的年份和周數,前四個數是年份,后兩個數是周數,既這一天正處于該年第幾周
eg:
????????YEARWEEK('2023-12-05'),得到202349;
????????YEARWEEK('2023-1-1'),得到202301;
????????YEARWEEK('2023-1-15'),得到202303;
15、WEEKOFYEAR(date)
返回當前周數(自然周),從每年的第一個周一開始計算的,日期所處年份第一個周一之前的日期全部歸為上一年的最后一周的周數;一周從星期一開始算起,過了周日便周數便+1
eg:
????????WEEKOFYEAR('2023-12-05'),得到49;
????????WEEKOFYEAR('2023-1-15'),得到02;
值得注意的一點是,我們去計算2022年1月1-3號的周數時,1,2號返回的是51,但3號返回的是1,觀察日歷可以發現這是因為WEEKOFYEAR計算是以每年的第一個周一開始計算的,而不是從1月1日開始;
????????WEEKOFYEAR('2022-1-1'),得到52;
????????WEEKOFYEAR('2022-1-2'),得到52;
????????WEEKOFYEAR('2022-1-3'),得到1;
16、WEEK(date)
返回當前周數(自然周),從每年的1月1日算起,周數從0開始計算,每年第一周為0;一周從周日開始計算,過了周六周數便 +1
eg:
????????WEEK('2022-1-1'),得到0;
????????WEEK('2022-1-2'),得到1;
????????WEEK('2022-1-2'),得到1;
????????WEEK('2022-1-4'),得到1;
????????WEEK('2022-1-5'),得到1;
????????WEEK('2022-1-6'),得到1;
????????WEEK('2022-1-7'),得到1;
????????WEEK('2022-1-8'),得到1;本日是周六
????????WEEK('2022-1-9'),得到2;
17、DAYOFYEAR(date)
提取當前日期在本年的天數
eg:
????????DAYOFYEAR('2022-01-9'),得到9;
????????DAYOFYEAR('2022-02-9') 得到40
18、DAYOFMONTH(date)
返回當前日期在所在的月的天數,給予錯誤日期返回null
eg:
????????DAYOFMONTH('2022-02-28'),得到28
????????DAYOFMONTH('2022-02-29'),得到null
19、DAYOFWEEK(date)
返回是當天日期中一周的第幾天,該函數一周從周日開始
eg:
????????DAYOFWEEK('2022-01-1') 得到7
????????DAYOFWEEK('2022-01-2') 得到1
20、LAST_DAY(date)
返回該月的最后一天
eg:
????????LAST_DAY('2022-01-2')得到?2022-01-31;
????????LAST_DAY('2022-02-02') 得到2022-02-28;
21、UNIX_TIMESTAMP()
返回一個UNIX時間戳
?eg:?
????????UNIX_TIMESTAMP() 得到?1701753714
????????UNIX_TIMESTAMP('2023-01-01 12:00:00') 得到?1672545600
22、FROM_UNIXTIME(unix_timestamp,format)
將時間戳按照指定時間格式返回,unix_timestamp 是時間戳,該字段為必填項;format 是數據格式,為選填項,不填默認是 YYYY-MM-DD hh:mm:ss 的格式
eg:
????????FROM_UNIXTIME(1701753829) 得到:2023-12-05 13:23:49
????????FROM_UNIXTIME(1701753830,'%H:%i:%s %Y-%m-%d') 得到:13:23:50 2023-12-05
23、WEEKDAY(date)
返回指定時間所處的星期二數,周一至周日 由0-6表示
eg:
????????WEEKDAY('2023-12-5') 該日為周二,得到返回值 1
????????WEEKDAY('2023-12-4') 該日為周一,得到返回值 0
????????WEEKDAY('2023-12-10') 改日為周日,得到返回值 6
24、FROM_DAYS(N)
返回距離公元0年N天所代表的日期,N代表天數,當N處于0-365天時,返回的是0000-00-00, 2000-1-1號的日期是730485
eg:?
????????FROM_DAYS(0) 得到0000-00-00
????????FROM_DAYS(365) 得到 0000-00-00;
????????FROM_DAYS(366) 得到0001-01-01;
????????FROM_DAYS(367) 得到0001-01-02
25、TO_DAYS(date)
返回給定日期距離公元0年的天數,date是日期
eg:
????????TO_DAYS('2000-01-01') 得到?730485
????????TO_DAYS('0000-00-00') 得到 null
????????TO_DAYS('0001-01-01') 得到366
26、LAST_DAY(date)
返回指定日所處月份的最后一天的日期,date 必須是年月日格式,若只給年月則會返回null
eg:
????????LAST_DAY('2023-02-01') 得到2023-02-28;
????????LAST_DAY('2023-02') 得到 null
27、MAKEDATE(year,dayofyear)
根據給定年份和指定天數,返回該年中這一天所處的日期;year 是年份,dayofyear 是天數
eg:
????????MAKEDATE(2023,20) 得到?2023-01-20
????????MAKEDATE(2023,360) 得到?2023-12-26
28、STR_TO_DATE(str,format)
將打亂的時間字符串根據指定的時間格式映射后按照 YYYY-MM-DD hh:mm:ss 的時間格式,返回有的時間,若指定的時間格式在字符串中無法找到,則將對應的數據用0填充
eg:
????????STR_TO_DATE('12,20,09 2023-01-05','%H,%i,%s %Y-%m-%d') 得到?2023-01-05 12:20:09
????????STR_TO_DATE('12,20,09','%H,%i,%s %Y-%m-%d') 得到?0000-00-00 12:20:09
????????STR_TO_DATE('12,20,09','%H,%i,%s') 得到?12:20:09
29、Time(expr)
返回給定日期中,僅關于時間的部分
eg:?
????????TIME('2023-01-01 12:30:09') 得到?12:30:09
30、MAKETIME(hour,minute,second)
根據給定時分秒組裝返回一個時間,minute和second的取值只能在0-59,否則會返回null
eg:?
????????MAKETIME(23,01,20) 得到?23:01:20
????????MAKETIME(-100,50,50) 得到??-100:50:50
????????MAKETIME(10,60,50) 得到null
31、SEC_TO_TIME(seconds)
將傳入的秒數轉換為 hh:mm:ss 的時間值,秒數可為負值
eg:
????????SEC_TO_TIME(10) 得到?00:00:10
????????SEC_TO_TIME(-10) 得到?-00:00:10
????????SEC_TO_TIME(100) 得到?00:01:40
32、QUARTER(date)
一年按照每3個月為一個季度的規律,總共分為4個季度,改函數是根據給定的日期字符串判斷出該日期處于那個季度
eg:
????????QUARTER('2023-01-01') 得到1;
????????QUARTER('1-01')? 得到null,表示只給月和日是不行的
????????QUARTER('0000-07-01') 得到3
33、TO_SECONDS(expr)
返回根據給定日期到公元0年的秒數
eg:
????????TO_SECONDS('0000-01-01') 得到?86400
????????TO_SECONDS('01-01') 的到 null
34、CONVERT_TZ(dt,from_tz,to_tz)
將一個時區的時間轉換為另一個時區的時間并返回;
- dt: 為時間
- from_tz :為該時間本身的時區
- to_tz: 為要轉換的時區;
eg:
????????CONVERT_TZ('2022-01-01 14:00:00', 'GMT', 'MET') 得到?2022-01-01 15:00:00
(三)、時間計算
1、DATE_ADD(date,INTERVAL?expr type)
對日期進行加法計算; date是日期,INTRRVAL是關鍵字, expr 是指要操作的時間數,type是要操作的時間數的單位;
expr 為正數時表示加,為負數時表示減
eg:
????????DATE_ADD('2023-12-03',INTERVAL 1 DAY),得到2023-12-04,這個操作是在指定的日期上加上一天
????????DATE_ADD('2023-12-03',INTERVAL -1 YEAR),得到2022-12-03,這個操作是在指定的日期上減去一年
????????expr 為正數是表示加,為負數時表示減去
2、DATE_SUB(date,INTERVAL expr type)
對日期進行減法計算; date是日期,INTRRVAL是關鍵字, expr 是指要操作的時間數,type是要操作的時間數的單位;
expr 為正數時表示減,為負數時表示加
eg:
????????DATE_ADD('2023-12-03',INTERVAL -1 DAY),得到2023-12-04,這個操作是在指定的日期上加上一天
????????DATE_ADD('2023-12-03',INTERVAL 1 YEAR),得到2022-12-03,這個操作是在指定的日期上減去一年
3、DATEDIFF(expr1,expr2)
返回兩個日期相隔的天數;expr1為時間1,expr2為時間2,當expr1<expr2時,返回的值是負數,當expr1>expr2 時,返回的天數是正數
eg:
????????DATEDIFF('2023-03-01','2023-04-01'),得到 -31;
????????DATEDIFF('2023-04-01','2023-03-01'),得到 31
4、ADDDATE()
返回對指定日期的增減時間操作后得到的日期,操作的日期為正數則是增,為負數則是減
該函數有兩種模式:
- ? ? ? ? 模式一: ADDDATE(date,INTERVAL expr unit),指定操作日期單位
- ? ? ? ? 模式二:ADDDATE(expr,days),默認操作日期單位為天
eg:??
????????ADDDATE('2022-01-01',INTERVAL 1 month), 得到 2022-02-01
????????ADDDATE('2022-01-01',3) 得到 2022-01-04
????????ADDDATE('2022-01-01',INTERVAL -1 month) 得到2021-12-01
????????ADDDATE('2022-01-01',-3) 得到 2021-12-29
5、SUBDATE()
返回對指定日期的增減時間操作后得到的日期
該函數有兩種模式:
- ? ? ? ? 模式一: SUBDATE(date,INTERVAL expr unit),可指定操作日期單位
- ? ? ? ? 模式二:SUBDATE(expr,days),默認操作日期單位為天
eg:?
????????SUBDATE('2022-01-01',INTERVAL 1 month), 得到 2021-12-01
????????SUBDATE('2022-01-01',3) 得到 2021-12-29
????????SUBDATE('2022-01-01',INTERVAL -1 month) 得到2022-02-01
????????SUBDATE('2022-01-01',-3) 得到 2022-01-04
6、TIMESTAMPDIFF(unit,expr1,expr2)
返回兩個指定日期的時間差;unit指返回時間差轉換的單位,expr1、expr2是兩個時間,當expr1<expr2 返回正數,當expr1>expr2返回負數,當返回的時間差不足1的時候,會被舍去。
eg:
????????TIMESTAMPDIFF(HOUR,'2022-01-01 12:30:00','2022-01-01 17:30:00') 得到 5
????????TIMESTAMPDIFF(HOUR,'2022-01-01 17:30:00','2022-01-01 12:30:00') 得到-5
????????TIMESTAMPDIFF(HOUR,'2022-01-01 17:00:00','2022-01-01 12:30:00')得到 -4,多余出來的半小時做了舍操作
????????TIMESTAMPDIFF(HOUR,'2022-01-01 12:59:00','2022-01-01 12:01:00') 得到 0,及不滿1小時,則直接返回0
7、TIMEDIFF(expr1,expr2)
返回兩個時間的差值,expr1<expr2時返回負值,expr1>expr2時返回正值,當單位更小的時間不夠時,會從大的時間單位中借調1位
eg:
????????TIMEDIFF('12:01:01','13:05:06') 得到:-01:04:05
????????TIMEDIFF('13:05:06','13:04:05')? ?得到?00:01:01
????????TIMEDIFF('13:05:06','13:04:07')得到:00:00:59
8、TIMESTAMP(expr1,expr2)
將傳入的一或兩個時間合并轉化為一個日期時間;
eg:
????????TIMESTAMP('2023-12-01')? 得到 2023-12-01 00:00:00;
????????TIMESTAMP('2023-12-01',1) 得到?2023-12-01 00:00:01
????????TIMESTAMP('2023-12-01','12:20:03')? 得到?2023-12-01 12:20:03
9、TIMESTAMPADD(unit,interval,datetime_expr)
將一個時間數加至指定的時間上,并返回新的時間
- unix: 為添加時所指定的時間單位;
- interval: 為添加時所指定的時間數量;
- datetime_expr:為指定的時間
eg:
????????TIMESTAMPADD(day,5,'2023-12-01') 得到?2023-12-06
????????TIMESTAMPADD(week,2,'2023-12-01') 得到?2023-12-15
10、ADDTIME(expr1,expr2)
給指定的時間加上一段時間間隔,并得到新的時間,若expr2為負數,則表示減去一段時間間隔
- expr1 : 指定的時間
- expr2 : 給定的時間間隔
eg:?
????????ADDTIME('12:03:02',10) 得到?12:03:12
????????ADDTIME('10:03:02','2:05:06') 得到?12:08:08
????????ADDTIME('10:03:02',200) 得到10:05:02,此處200被默認解析為00:02:00
????????ADDTIME('10:03:02',2000) 得到?10:23:02
????????ADDTIME('10:30:30',-2000) 得到?10:10:30
11、SUBTIME(expr1,expr2)
給指定的時間減去一段時間間隔,并得到新的時間,若是-expr2為負數,則會變為增加一段時間間隔
- expr1 : 指定的時間
- expr2 : 給定的時間間隔
eg:
????????SUBTIME('2023-01-01 10:30:30',30) 得到?2023-01-01 10:30:00
????????SUBTIME('2023-01-01 10:30:30',3000) 得到?2023-01-01 10:00:30,3000被切割為 30:00
????????SUBTIME('10:30:30',-20) 得到?10:30:50
12、PERIOD_ADD(P,N)
返回給指定的日期上加上指定的月數的結果,
- P: 指定的日期,必須是 年月的格式,年和月中間不能有符號
- N:? ?指定的月數,僅為整數,當為負值時,表示減去指定的月數
eg:
????????PERIOD_ADD('202005',5) 得到 202010
????????PERIOD_ADD('202005',-5) 得到 201912
13、PERIOD_DIFF(P1,P2)
返回給定兩個日期相隔的月數,當P1<P2時為負,P1>P2時為正;
eg:
????????PERIOD_DIFF(202301,202309) 得到 -9;
????????PERIOD_DIFF(202304,202302) 得到 2?
二、時間函數小提示
很多時間函數根據其被運用在不同語境,數字或者字符串語境中會返回不同的時間格式。
比如以UTC_DATE為例,當他返回日期的時候,默認返回的格式是YYYY-MM-DD,
但如果你想要它返回YYYMMDD的格式,你可以在這個函數后給他加個0,
eg:
? ? ? ? UTC_DATE()?得到 2023-12-06
? ? ? ? ?UTC_DATE()+0 得到 20231206
三、函數中?format 參數的格式
- %Y : 4位的年
- %y :2位的年份
- %M :月份的英文全名(January..December)
- %m :2位的月份(00...12)
- %b:月份的縮寫 (Jan..Dec)
- %c :? ?月份數字 (0..12)
- %W:星期的全名?(Sunday..Saturday)
- %w:星期的縮寫(0..6 對應周一至周六)
- %a?? ?星期的縮寫
- %X:? ? 一年中的星期,每周的開始是星期天,四位數字,用于 %V
- %x :? ?一年中的星期,每周的開始是星期一,四位數字,用于 %v
- %U :? ?一年中的星期 (00..53), 每周的開始是星期天; WEEK() 函數中的 mode 0
- %u?:? 一年中的星期 (00..53), 每周的開始是星期一; WEEK() 函數中的 mode 1
- %V :? ?一年中的星期 (01..53), 每周的開始是星期天; WEEK() 函數中的 mode 2, 用于 %X
- %v :? ?一年中的星期 (01..53), 每周的開始是星期一; WEEK() 函數中的 mode 3, 用于 %x
- %D:? ? 帶有英語前綴的月份中的每天 (0th, 1st, 2nd, 3rd, …)
- %d :? ?月份中的每天的兩位數字表示 (00..31)
- %e :? ?月份中的每天的數字表示 (0..31)
- %j :? ?一年中的每天 (001..366)
- %d:2位的日期
- %H:24小時制的小時
- %h:12小時制的小時
- %T:? ? 二十四小時制時間 (hh:mm:ss)
- %r :? ? 十二小時制時間 (hh:mm:ss 后跟 AM 或 PM)
- %p :? ?AM 或者 PM
- %i :2位的分鐘(00...59)
- %S :?? ?秒 (00..59)
- %s :2位的秒鐘(00...59)
- %f :? ? 微秒 (000000..999999)
參考資料:MYSQL日期函數_MYSQL時間函數詳解和實戰(你想要的都有70多個函數幾百種用法建議收藏以備查閱)
MySQL str_to_date()函數
MySQL中的日期函數 - 知乎
mysql輸出當前是第幾周使用week和weekofyear的區別
最全總結---36種MySQL時間函數
mysql的sysdate_MySQL獲取時間及日期的函數--sysdate()
感謝以上大佬的整理和共享!!!???