12類(lèi)Oracle日期函數(shù)超全面總結(jié)
前言
在使用Oracle數(shù)據(jù)庫(kù)過(guò)程中,對(duì)日期的使用不可避免,那Oracle中的日期函數(shù)有哪些呢?本篇就日期函數(shù)進(jìn)行整理了,不一定全部了解記住,但是要做到心中有數(shù),以后在寫(xiě)腳本的時(shí)候就不會(huì)繞彎子了。
1、sysdate、current_date及systimestamp
sysdate
Oracle使用計(jì)算機(jī)操作系統(tǒng)的當(dāng)前日期和時(shí)間,是通過(guò)sysdate函數(shù)實(shí)現(xiàn)的,在任何可以使用Oracle函數(shù)的地方都可以使用sysdate函數(shù),可以將它視為每個(gè)表的一個(gè)隱藏列或者偽列。也就是說(shuō)即使一張表沒(méi)有sysdate這個(gè)字段,也可以如下這樣查詢(xún)。
select sysdate from all_users; >> 2022-10-15 23:09:37
current_date
此字段返回的是當(dāng)前會(huì)話(huà)的時(shí)區(qū)的系統(tǒng)日期,我們一般使用的是東八區(qū)的時(shí)間,如果將當(dāng)前會(huì)話(huà)時(shí)間修改成東九區(qū)試試:
alter session set time_zone='+09:00'; select current_date, sysdate from dual; >> 2022-10-15 10:11:51 2022-10-15 09:11:51
通過(guò)例子就很明顯看出兩者區(qū)別了,一個(gè)依賴(lài)于時(shí)區(qū),一個(gè)不依賴(lài)。
systimestamp
函數(shù)systimestamp,它返回的是本機(jī)的系統(tǒng)時(shí)間,精確到微秒,并包含了當(dāng)前時(shí)區(qū),它跟會(huì)話(huà)的時(shí)區(qū)無(wú)關(guān)。
select systimestamp from dual >> 2022-10-15 23:15:43.699000 +08:00
2、兩個(gè)日期的差
如何計(jì)算兩個(gè)日期的差呢,可以直接進(jìn)行相減,返回的數(shù)值單位是天,也可以用一個(gè)日期加減某個(gè)數(shù)值代表N天后(前)。
比如十天后發(fā)工資,那么十天后是哪一天呢?
select sysdate+10 from dual >> 2022-10-25 23:18:16
再比如今年春節(jié)是2023-01-22,那么距離過(guò)年還有哪個(gè)多少天呢?
select to_date('2023-01-22','yyyy-MM-dd') - sysdate from dual >> 98.02703703703703703703703703703703703704
暈,還有3個(gè)月呢~
3、添加月份、減少月份
既然天數(shù)可以加減,那么月份是否也可以這樣操作了。其實(shí)就用到了這個(gè)函數(shù):add_months,不管是向前或向后查,只不過(guò)是參數(shù)是正還是負(fù)而已。
例如:查詢(xún)一下三個(gè)月后、兩個(gè)月前分別是哪一天:
select add_months(sysdate,3), add_months(sysdate,-2) from dual >> 2023-01-15 23:23:40 2022-08-15 23:23:40
那么對(duì)于年份呢,只要在上面參數(shù)基礎(chǔ)上乘以12就可以推算了。
4、greatest和least
這兩個(gè)函數(shù)在數(shù)值函數(shù)中分別代表取一組數(shù)值中的最大值和最小值,在日期中也有相關(guān)應(yīng)用。greatest是從一組日期數(shù)據(jù)中取距離當(dāng)前最近的日期,least是在一組日期中選擇最早的日期。
select greatest(to_date('2013-11-11','yyyy-MM-dd'),to_date('2013-12-11','yyyy-MM-dd'),to_date('2014-01-05','yyyy-MM-dd'),to_date('2013-11-11','yyyy-MM-dd')) from dual >> 2014-01-05 00:00:00 select least(to_date('2013-11-11','yyyy-MM-dd'),to_date('2013-12-11','yyyy-MM-dd'),to_date('2014-01-05','yyyy-MM-dd'),to_date('2013-11-11','yyyy-MM-dd')) from dual >> 2013-11-11 00:00:00
值得注意的是,這里必須用to_date對(duì)字符串進(jìn)行轉(zhuǎn)化,否則會(huì)把他們無(wú)法判斷是否為日期格式,只能當(dāng)成字符串去處理,容易出現(xiàn)結(jié)果錯(cuò)誤的情況。
5、next_day
此函數(shù)表示從指定日期開(kāi)始算,下周幾是幾號(hào)?此函數(shù)的第二個(gè)參數(shù)范圍是[1,7],超出范圍會(huì)報(bào)錯(cuò),注意的是:1代表周日,7代表周六。
select next_day(to_date('2022-10-15','yyyy-MM-dd'),2) from dual >> 2022-10-17 00:00:00
如上sql表示,假設(shè)今天是10月15日,下個(gè)周二是10月17日。如果參數(shù)超出范圍會(huì)報(bào)錯(cuò):
select next_day(to_date('2022-10-15','yyyy-MM-dd'),8) from dual > ORA-01846: 周中的日無(wú)效
6、last_day
此函數(shù)用來(lái)計(jì)算某個(gè)月的最后一天是哪天,有了這個(gè)函數(shù)就不要每個(gè)月都判斷一下了。
select last_day(sysdate) from dual >> 2022-10-31 23:36:12 select last_day(to_date('2022-11-15','yyyy-MM-dd')) from dual >> 2022-11-30 00:00:00
7、months_between
此函數(shù)用來(lái)計(jì)算兩個(gè)日期之間相差的月份數(shù),返回結(jié)果可能帶小數(shù)。例如計(jì)算下自己的周歲,才發(fā)現(xiàn)還未成年呢~
select floor(months_between(sysdate ,to_date('2005-08-24','yyyy-MM-dd'))/12) from dual >> 17
8、組合日期函數(shù)
如上列舉的日期函數(shù)中,根據(jù)參數(shù)格式都可以組合使用。
舉例:小剛2022年10月28日入職新公司,兩個(gè)月試用期,新員工過(guò)了試用期后的每月第一天可以做轉(zhuǎn)正報(bào)告。那小剛什么時(shí)候可以做轉(zhuǎn)正報(bào)告?
select last_day(add_months(to_date('2022-10-28','yyyy-MM-dd'),2))+1 from dual >> 2023-01-01 00:00:00
思路:先用add_months計(jì)算倆月后是哪一天,再用last_day計(jì)算那個(gè)月的最后一天,再+1代表下個(gè)月的第一天。
9、round 和 trunc
在數(shù)值函數(shù)中,round和trunc函數(shù)是對(duì)小數(shù)的處理,那么在日期函數(shù)中,是否有相同或類(lèi)似的應(yīng)用呢?
我們用一個(gè)日期減去另一個(gè)日期的時(shí)候經(jīng)常會(huì)帶有小數(shù),這是因?yàn)镺racle中保留了時(shí)、分、秒。有的時(shí)候我們不需要時(shí)、分、秒,所以就需要用到round和trunc這兩個(gè)函數(shù)了。
round函數(shù)作用是:如果某天的時(shí)間在中午之前,那么使用round函數(shù)會(huì)將該天的時(shí)間設(shè)置為0點(diǎn)(就是午夜),如果為中午之后就設(shè)置為次日零點(diǎn),這也就是時(shí)間方面的四舍五入了。
trunc的函數(shù)作用:舍去,無(wú)論某天處于什么時(shí)間,使用trunc函數(shù)后都會(huì)將改天時(shí)間置為當(dāng)日0點(diǎn)。
select sysdate from dual >> 2022-10-15 23:46:48 select to_date('2022-10-17','yyyy-MM-dd')-round(sysdate), to_date('2022-10-17','yyyy-MM-dd')-trunc(sysdate) from dual >> 1 2
如上,今天是10月15日 23點(diǎn),因此round(sysdate)四舍五入為次日零點(diǎn),即10月16日零點(diǎn),因此距離17日相差1天。而trunc(sysdate)則是15日,因此相差2天。
10、使用to_date 和 to_char設(shè)置日期時(shí)間格式
基本使用
函數(shù)to_date 和 to_char作用是相反的,但是用法很類(lèi)似。
to_date是將字符串轉(zhuǎn)換為時(shí)間格式,而to_char是將日期轉(zhuǎn)換為字符串格式。這兩個(gè)函數(shù)我們平時(shí)用的實(shí)在是太多了,舉例說(shuō)明一下。
select to_date('2022/11/11 12:01:14','yyyy-MM-dd HH:MI:SS') from dual >> 2022-11-11 12:01:14 select to_char(sysdate, 'yyyyMMdd HH:MI:SS') from dual >> 20221015 11:54:17
在函數(shù)to_char使用的時(shí)候可以在format參數(shù)中插入字符串,以雙引號(hào)的方式插入,至于雙引號(hào)在SQL中的用法,在我的另一篇文章也有介紹。
select to_char(sysdate , 'yyyy"年"MM"月"dd"日"') from dual; >> 2022年10月15日
最常見(jiàn)的to_char錯(cuò)誤
在轉(zhuǎn)換的時(shí)候,月份和分鐘經(jīng)常混淆。這里要注意下,MM代表的是月份,MI代表是分鐘,由于Oracle中支持的時(shí)間很靈活,所以這塊弄混了不會(huì)提示的。
select to_char(sysdate ,'yyyy-MI-dd hh:mm:ss') from dual >> 2022-57-15 11:10:36
如上,即使MI與MM互換了位置也不會(huì)報(bào)錯(cuò)的。如果分鐘的數(shù)值是1-12內(nèi),那這個(gè)錯(cuò)就很難發(fā)現(xiàn)了。
to_date整形參數(shù)
函數(shù)to_date的參數(shù)不僅可以接受字符串的參數(shù),還可以接受數(shù)值類(lèi)型的參數(shù),這樣使Oracle處理時(shí)間更加的靈活。
select to_date(20221222,'yyyy-MM-dd') from dual >> 2022-12-22 00:00:00
11、new_time 切換時(shí)區(qū)
先看下函數(shù)參數(shù)用法:new_time(date,‘this’,‘other’),函數(shù)共有3個(gè)參數(shù):date代表的是this時(shí)區(qū)的時(shí)間,‘this’代表的是用三個(gè)字母組成的縮寫(xiě)代替,代表當(dāng)前時(shí)區(qū),‘other’也是用三個(gè)字母組成的縮寫(xiě)代替,表示其他時(shí)區(qū)。聽(tīng)起來(lái)比較模糊,舉例理解一下。
查詢(xún)一下‘2022-10-01 12:00:00’這個(gè)時(shí)間在北京和夏威夷的時(shí)間分別是多少?
select to_date('2022-10-01 12:00:00','yyyy-MM-dd hh24:mi:ss'),new_time(to_date('2022-10-01 12:00:00','yyyy-MM-dd hh24:mi:ss'),'EST','HST') from dual >> 2022-10-01 12:00:00 2022-10-01 07:00:00
其中,EST和HST都是全球時(shí)區(qū)的縮寫(xiě),可以另行科普一下。
12、EXTRACT
函數(shù)EXTRACT可用來(lái)代替to_char函數(shù)來(lái)選擇日期值中的某一部分(如從一個(gè)日期中選擇月份和天)。
SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; >> 2022 SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL; >> 10 SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL; >> 16
注意:EXTRACT抽取年月日部分和抽取時(shí)分是不同的,抽取時(shí)分的時(shí)候需要這樣寫(xiě):
SELECT EXTRACT(hour FROM TIMESTAMP '2022-12-22 22:34:12') FROM DUAL >> 22 SELECT EXTRACT(minute FROM TIMESTAMP '2022-12-22 22:34:12') FROM DUAL >> 34
其實(shí),這個(gè)函數(shù)的功能幾乎可以用to_char取代,因?yàn)槠涔δ芡耆梢蕴娲?,如下?/p>
select to_char(sysdate ,'yyyy') from dual >> 2022 select to_char(sysdate ,'HH') from dual >> 12
綜上,Oracle當(dāng)中的時(shí)間函數(shù)使用非常靈活,可以變換各種格式進(jìn)行查詢(xún)處理。
總結(jié)
到此這篇關(guān)于12類(lèi)Oracle日期函數(shù)超全面總結(jié)的文章就介紹到這了,更多相關(guān)Oracle日期函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)中的用戶(hù)授權(quán)、取消權(quán)限方式
Oracle數(shù)據(jù)庫(kù)中的用戶(hù)授權(quán)分為系統(tǒng)權(quán)限和對(duì)象權(quán)限,系統(tǒng)權(quán)限允許用戶(hù)執(zhí)行特定的系統(tǒng)級(jí)操作,如創(chuàng)建表或啟動(dòng)事務(wù),對(duì)象權(quán)限針對(duì)特定數(shù)據(jù)庫(kù)對(duì)象,如表、視圖或過(guò)程,包括SELECT、INSERT、UPDATE和DELETE等,角色是一組權(quán)限的集合,可以簡(jiǎn)化權(quán)限管理2024-12-12windows本地安裝配置oracle客戶(hù)端完整流程(圖文版)
這篇文章主要介紹了windows本地安裝配置oracle客戶(hù)端完整流程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-09ORACLE數(shù)據(jù)庫(kù)逐步解決ORA-12541、ORA-01034和ORA-27101、ORA-00119和ORA0013
這篇文章主要介紹了ORACLE數(shù)據(jù)庫(kù)逐步解決ORA-12541、ORA-01034和ORA-27101、ORA-00119和ORA00132過(guò)程的相關(guān)步驟,需要的朋友可以參考下2020-04-04oracle通過(guò)1條語(yǔ)句插入多個(gè)值的方法示例
這篇文章主要給大家介紹了關(guān)于oracle通過(guò)1條語(yǔ)句插入多個(gè)值的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用oracle具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Oracle 數(shù)據(jù)庫(kù)忘記sys與system管理員密碼重置操作方法
這篇文章主要介紹了Oracle 數(shù)據(jù)庫(kù)忘記sys與system管理員密碼重置操作,需要的朋友可以參考下2017-06-06oracle數(shù)據(jù)庫(kù)關(guān)于索引建立及使用的詳細(xì)介紹
這篇文章主要介紹了oracle數(shù)據(jù)庫(kù)關(guān)于索引建立及使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Oracle如何通過(guò)表名查詢(xún)觸發(fā)器
這篇文章主要介紹了Oracle如何通過(guò)表名查詢(xún)觸發(fā)器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Oracle ASM數(shù)據(jù)庫(kù)故障數(shù)據(jù)恢復(fù)解決方案
這篇文章主要介紹了Oracle ASM數(shù)據(jù)庫(kù)故障數(shù)據(jù)恢復(fù)解決方案,需要的朋友可以參考下2017-04-04Oracle rac模式下undo表空間爆滿(mǎn)的解決方案
Oracle數(shù)據(jù)庫(kù)中的Undo表空間是用于存儲(chǔ)事務(wù)回滾信息的特殊表空間,它記錄了數(shù)據(jù)庫(kù)中執(zhí)行的所有未提交事務(wù)的歷史信息,以便在需要時(shí)進(jìn)行回滾或恢復(fù)操作,在本文中,我們將深入探討Oracle rac模式下undo表空間爆滿(mǎn)的解決方案,需要的朋友可以參考下2024-09-09