Mysql 中的日期時間函數(shù)示例詳解
前言
在 MySQL 中,處理日期和時間是非常常見的需求,MySQL中內(nèi)置了大量的日期和時間函數(shù),能夠靈活、方便地處理日期和時間數(shù)據(jù),本節(jié)就簡單介紹一下 MySQL中內(nèi)置的日期和時間函數(shù),以便更好地利用這些函數(shù)來處理日期和時間數(shù)據(jù)。
獲取當前日期和時間
獲取當前時刻的時間就是獲取程序運行的那一刻與時間相關的數(shù)據(jù),比如年月日、時分秒等信息。
序號 | 函數(shù) | 簡要說明 |
---|---|---|
1 | now() | 用于獲取當前的日期和時間,其返回值格式為 YYYY-MM-DD HH:MM:SS 。該函數(shù)在整個查詢過程中保持不變,可以確保所有記錄的時間戳一致,因此被廣泛用于記錄數(shù)據(jù)的創(chuàng)建時間或更新時間。 |
2 | curdate() | 用于獲取當前的日期,其返回值格式為 YYYY-MM-DD 。該函數(shù)在需要僅獲取日期信息時非常有用,因為它可以避免對時間部分的額外處理。 |
3 | curtime() | 用于獲取當前的時間,其返回值格式為 HH:MM:SS 。該函數(shù)在需要僅獲取時間信息時非常有用,例如在記錄事件發(fā)生的具體時間或計算時間間隔時。 |
4 | current_timestamp() | 用于獲取當前的日期和時間,其返回值格式為 YYYY-MM-DD HH:MM:SS 。 |
5 | sysdate() | 用于獲取執(zhí)行時的日期和時間。 |
INSERT INTO orders (order_id, order_time) VALUES (1, NOW()); SELECT COUNT(*) FROM sales WHERE sale_date = CURDATE(); SELECT CURTIME();
日期時間格式化與轉(zhuǎn)換
我們知道同一個日期時間會有多種不同的表示方式,有的時候需要在不同格式之間相互轉(zhuǎn)換。在 MySQL 中,可以使用日期函數(shù)將日期和時間數(shù)據(jù)從一種格式轉(zhuǎn)換為另一種格式,以下是一些常用的日期格式轉(zhuǎn)換函數(shù):
序號 | 函數(shù) | 簡要說明 |
---|---|---|
1 | date_format(datetime,format) | 用于將日期和時間值按照指定的格式進行格式化,其返回值為一個字符串,在需要將日期和時間以特定格式展示時非常有用。 該函數(shù)支持多種格式化選項,可以根據(jù)需求靈活定制日期時間的顯示格式。 |
2 | time_format(time,format) | 按照指定的格式format來格式化日期date |
3 | STR_TO_DATE(str, format) | 用于將字符串轉(zhuǎn)換為日期或日期時間值,其返回值為一個日期或日期時間值,在需要將非標準格式的字符串日期轉(zhuǎn)換為標準的日期格式時非常有用。 |
4 | FROM_DAYS() | 將天數(shù)轉(zhuǎn)換為日期 |
5 | TIME_TO_SEC(time) | 將time轉(zhuǎn)化為秒并返回結(jié)果值,轉(zhuǎn)化的公式為:小時*3600 + 分鐘*60 + 秒。 |
6 | SEC_TO_TIME(seconds) | 將seconds描述轉(zhuǎn)化為包含小時、分鐘和秒的時間 |
在上述方法中,其中 datetime 表示要被轉(zhuǎn)換的具體的日期時間,format 表示要轉(zhuǎn)換成的格式,可選的格式如下:
格式 | 描述 | 格式 | 描述 | 格式 | 描述 |
---|---|---|---|---|---|
%Y | 4位數(shù)的年 | %T | 返回當前的時分秒, 24-小時 (hh:mm:ss) | ||
%b | 月份對應的英文縮寫 | %M | 月份對應的英文全稱 | %m | 01-12的月 |
%c | 1-12的月份數(shù)值 | %d | 01-31的某月里面的第幾天 | %e | 1-31的某月里面的第幾天 |
%D | 用th后綴表示某月中的第幾天 | %j | 001-366的一年中的第幾天 | %a | 星期幾對應的英文縮寫 |
%W | 星期幾對應的英文全稱 | %H | 00-23的小時 | %h | 01-12的小時 |
%i | 00-59的分鐘 | %S | 秒(00-59) | %f | 微秒 |
SELECT DATE_FORMAT('2022-11-09 12:34:56', '%Y-%m-%d %H:%i:%s');
日期時間計算(加減)
有的時候我們也需要對日期之間進行運算,比如要獲取今天往前7天對應的日期,或者今天往后13天對應的日期,可以去翻日歷,也可以去數(shù)數(shù),但是這些方法肯定都不是最直接的方法,所以需要日期之間的運算。MySQL 提供了一些日期函數(shù),可以使用這些函數(shù)來執(zhí)行日期加法、日期減法等操作。以下是一些常用的日期計算函數(shù):
序號 | 函數(shù) | 簡要說明 |
---|---|---|
1 | date_add(date, INTERVAL num unit) | 用于在日期上添加指定的時間間隔,其返回值為一個新的日期值,常用于計算未來的日期。 |
2 | ADDDATE(date, INTERVAL num unit) | 在日期上加上指定的時間間隔。 |
3 | ADDTIME(time1,time2) | 返回time1加上time2的時間 |
4 | date_sub(date, INTERVAL num unit) | 用于從日期中減去指定的時間間隔,其返回值為一個新的日期值,常用于計算過去的日期。 |
5 | SUBDATE(date, INTERVAL num unit) | 從日期中減去指定的時間間隔。 |
6 | SUBTIME(time1,time2) | 返回time1減去time2后的時間。 |
7 | datediff(date1,date2) | 用于計算兩個日期之間的天數(shù)差,其返回值為一個整數(shù),表示兩個日期之間的天數(shù)差,常用于計算時間間隔,例如任務的持續(xù)時間等。 |
8 | TIMEDIFF(time1, time2) | 計算兩個時間之間的時間差 |
9 | TIMESTAMPDIFF(unit, expr1, expr2) | 計算兩個日期之間的時間差,以指定的單位返回。 |
10 | TIMESTAMPADD(unit, interval, datetime_expr) | 給日期時間添加指定單位的時間 |
11 | TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2) | 返回兩個日期時間表達式的時間差,使用指定的單位 |
在上述方法中,date表示具體的日期時間,interval是一個固定的參數(shù),unit 表示要返回的單獨的部分,unit 值可以是下列的值:
unit | 說明 | unit | 說明 | unit | 說明 |
---|---|---|---|---|---|
year | 年 | month | 月 | day | 日 |
hour | 小時 | minute | 分鐘 | second | 秒 |
week | 周數(shù),全年第幾周 |
SELECT DATE_ADD('2022-11-09', INTERVAL 10 DAY); SELECT DATE_SUB('2022-11-09', INTERVAL 10 DAY); SELECT DATEDIFF('2022-11-09', '2023-06-17'); SELECT TIMESTAMPDIFF(MONTH, '2022-01-01', '2023-12-31');
日期時間部分提取
序號 | 函數(shù) | 簡要說明 |
---|---|---|
1 | YEAR(date) | 用于獲取日期所在的年份,其返回值為一個整數(shù),表示年份。在實際應用中,常用于按年份對數(shù)據(jù)進行分組或篩選。 |
2 | MONTH(date) | 用于獲取日期對應的月份,其返回值為一個整數(shù),表示月份(1-12)。在實際應用中,在按月份對數(shù)據(jù)進行分組或篩選時非常有用。 |
3 | DAY(date) | 用于從日期或日期時間值中提取天數(shù)部分,其返回值為一個整數(shù),表示月份中的天數(shù),取值范圍1-31。 |
4 | HOUR(time) | 用于從時間或日期時間值中提取小時部分,其返回值為一個整數(shù),表示小時,取值范圍0-23。 |
5 | MINUTE(time) | 用于從時間或日期時間值中提取分鐘部分,其返回值為一個整數(shù),表示分鐘,取值范圍0-59。 |
6 | SECOND(time) | 用于從時間或日期時間值中提取秒部分,其返回值為一個整數(shù),表示秒,取值范圍0-59。 |
7 | DATE(date) | 用于提取日期或日期時間的日期部分 |
8 | MONTHNAME(date) | 用于獲取日期所在月份的英文名稱。 |
9 | DAYNAME(date) | 用于獲取給定日期對應星期的英文名稱。 |
10 | WEEKDAY(date) | 用于獲取日期對應的一周中的索引值。0表示星期一,1表示星期二,以此類推。 |
11 | QUARTER(date) | 用于獲取日期對應的季度,范圍為1~4。 |
12 | WEEK(date) | 用于獲取給定日期所在年的第幾周。 |
13 | WEEKOFYEAR(date) | 用于獲取給定日期所在年份的第幾周。 |
14 | DAYOFYEAR(date) | 用于獲取日期是一年中的第幾天 |
15 | DAYOFMONTH(date) | 用于獲取日期位于所在月份的第幾天 |
16 | DAYOFWEEK(date) | 用于獲取日期對應的一周中的索引值。1表示星期日,2表示星期一,以此類推。 |
17 | YEARWEEK(date) | 用于獲取日期所在的年份和周數(shù)。 |
18 | LAST_DAY(date) | 用于獲取日期所在月份的最后一天的日期。 |
SELECT YEAR('2022-11-09 12:34:56'); SELECT MONTH('2022-11-09 12:34:56'); SELECT DAY('2022-11-09 12:34:56'); SELECT HOUR('2022-11-09 12:34:56'); SELECT MINUTE('2022-11-09 12:34:56'); SELECT SECOND('2022-11-09 12:34:56');
時間戳轉(zhuǎn)換
序號 | 函數(shù) | 簡要說明 |
---|---|---|
1 | FROM_UNIXTIME(unix_timestamp[, format]) | 將UNIX時間戳轉(zhuǎn)換為可讀的日期格式。 |
2 | UNIX_TIMESTAMP(date) | 將日期轉(zhuǎn)換為UNIX時間戳。 |
SELECT FROM_UNIXTIME(1672444800); SELECT UNIX_TIMESTAMP(NOW());
其他有用的函數(shù)
函數(shù) | 簡要說明 |
---|---|
MAKEDATE(year,n) | 針對給定年份與所在年份中的天數(shù)返回一個日期。 |
MAKETIME(hour,minute,second) | 將給定的小時、分鐘和秒組合成時間并返回。 |
SELECT MAKEDATE(2025,1);
附錄
獲取本月第一天
SELECT DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY); SELECT CONCAT(DATE_FORMAT(CURDATE(), '%Y-%m'), '-01');
查詢今日、昨日、周、上月、本月數(shù)據(jù)
-- 今天 SELECT * FROM 表名 WHERE to_days(時間字段名) = to_days(now()); -- 昨天 SELECT * FROM 表名 WHERE TO_DAYS(NOW()) - TO_DAYS(時間字段名) <= 1 AND TO_DAYS(NOW()) - TO_DAYS(時間字段名) > 0; -- 近7天 SELECT * FROM 表名 WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(時間字段名); -- 查詢當前這周的數(shù)據(jù)(注意:獲取周是從周日至周六計算的,與我們國內(nèi)周一至周日的習慣不同) SELECT * FROM 表名 WHERE YEARWEEK(date_format(時間字段名, '%Y-%m-%d')) = YEARWEEK(now()); -- 查詢上周的數(shù)據(jù)(同上) SELECT * FROM 表名 WHERE YEARWEEK(date_format(時間字段名, '%Y-%m-%d')) = YEARWEEK(now()) - 1; -- 近30天 SELECT * FROM 表名 WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(時間字段名); 查詢當前月份的數(shù)據(jù) -- SELECT * FROM 表名 WHERE DATE_FORMAT(時間字段名, '%Y-%m') = DATE_FORMAT(now(),'%Y-%m'); -- SELECT * FROM 表名 WHERE DATE_FORMAT(時間字段名, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m' ); -- 上一月數(shù)據(jù) SELECT * FROM 表名 WHERE PERIOD_DIFF(date_format(now( ), '%Y%m') , date_format(時間字段名, '%Y%m')) = 1; -- 查詢本季度數(shù)據(jù) SELECT * FROM 表名 WHERE QUARTER(時間字段名) = QUARTER(now()); -- 查詢上季度數(shù)據(jù) SELECT * FROM 表名 WHERE QUARTER(時間字段名)=QUARTER(DATE_SUB(now(),interval 1 QUARTER)); -- 查詢本年數(shù)據(jù) SELECT * FROM 表名 WHERE YEAR(時間字段名)=YEAR(NOW()); -- 查詢上年數(shù)據(jù) SELECT * FROM 表名 WHERE year(時間字段名)=year(date_sub(now(),interval 1 year)); -- 查詢距離當前現(xiàn)在6個月的數(shù)據(jù) SELECT * FROM 表名 WHERE 時間字段名 between date_sub(now(), interval 6 month) and now();
小結(jié)
MySQL 中的常見日期函數(shù),包括日期函數(shù)的介紹、日期格式轉(zhuǎn)換、日期計算、日期比較以及其他日期函數(shù)。這些日期函數(shù)可以幫助我們更好地處理和操作日期和時間數(shù)據(jù),提高數(shù)據(jù)庫的查詢和分析效率。熟練掌握這些日期函數(shù),將有助于我們在 MySQL 中更好地處理日期和時間相關的業(yè)務需求
到此這篇關于Mysql 中的日期時間函數(shù)匯總的文章就介紹到這了,更多相關Mysql 日期時間函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring jdbc中數(shù)據(jù)庫操作對象化模型的實例詳解
這篇文章主要介紹了Spring jdbc中數(shù)據(jù)庫操作對象化模型的實例詳解的相關資料,希望通過本文大家能夠了解掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09mysql 一個較特殊的問題:You can''t specify target table ''wms_cabinet
mysql 一個較特殊的問題:You can't specify target table 'wms_cabinet_form' for update in F2010-11-11Canal實現(xiàn)MYSQL實時數(shù)據(jù)同步的示例代碼
本文詳細介紹了Canal部署的全過程,包括Canal-Admin、Canal-Server和Canal-Adapter的安裝和配置,涵蓋創(chuàng)建目錄、修改配置文件、容器部署等步驟,適用于MYSQL8.0+環(huán)境,旨在幫助用戶實現(xiàn)MYSQL實時數(shù)據(jù)同步2024-11-11MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)
最近因為一個用了子查詢的sql語句查詢很慢,嚴重影響了性能,所以需要進行優(yōu)化,下面這篇文章主要跟大家介紹了關于MySQL利用profile分析慢sql的相關資料,文中介紹的非常詳細,需要的朋友們可以參考借鑒,下面來一起看看吧。2017-03-03徹底搞懂數(shù)據(jù)庫操作truncate delete drop關鍵詞的區(qū)別
這篇文章主要為大家介紹了數(shù)據(jù)庫操作truncate delete drop關鍵詞的區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09