Oracle查詢優(yōu)化日期運(yùn)算實(shí)例詳解
加減日、月、年
在Oracle中,date類(lèi)型可以直接加減天數(shù),而加減月份要用add_months函數(shù).
select a.hiredate 雇用日期,
a.hiredate + 5 加5天,
a.hiredate - 5 減5天,
add_months(hiredate, 5) 加5個(gè)月,
add_months(hiredate, -5) 減5個(gè)月,
add_months(hiredate, 5 * 12) 加5年,
add_months(hiredate, -5 * 12) 減5年
from emp a where rownum <=1;
雇用日期 加5天 減5天 加5個(gè)月 減5個(gè)月 加5年 減5年
----------- ----------- ----------- ----------- ----------- ----------- -----------
1980-12-17 1980-12-22 1980-12-12 1981-05-17 1980-07-17 1985-12-17 1975-12-17
加減時(shí)、分、秒
上面講過(guò),date可以直接加減天數(shù),那么1/24就是一小時(shí),分鐘與秒的加減類(lèi)同。
select a.hiredate,
a.hiredate - 5 / 24 / 60 / 60 減5秒,
a.hiredate + 5 / 24 / 60 / 60 加5秒,
a.hiredate - 5 / 24 / 60 減5分鐘,
a.hiredate + 5 / 24 / 60 加5分鐘,
a.hiredate - 5 / 24 減5小時(shí),
a.hiredate + 5 / 24 加5小時(shí)
from emp a
where rownum <= 1;
如果執(zhí)行時(shí),報(bào)錯(cuò)

數(shù)據(jù)庫(kù)服務(wù)器端的編碼和客戶端字符集編碼不一致。
我這邊用的數(shù)據(jù)庫(kù)西班牙語(yǔ),不支持中文。
日期間隔之時(shí)、分、秒
SQL> select duration,
duration * 24 間隔小時(shí),
duration * 24 * 60 間隔分鐘,
duration * 24 * 60 * 60 間隔秒
from (select (max(a.hiredate) - min(a.hiredate)) as duration from emp a where
a.ename in ('ALLEN', 'WARD')) x;
DURATION 間隔小時(shí) 間隔分鐘 間隔秒
---------- ---------- ---------- ----------
2 48 2880 172800
日期間隔之日、月、年
加減月份用函數(shù) add_months, 而計(jì)算月份間隔就要用函數(shù)months_between
select max_hd - min_hd 間隔天,
months_between(max_hd, min_hd) 間隔月,
months_between(max_hd, min_hd) /12 間隔年
from (select min(hiredate) min_hd, max(hiredate) max_hd from emp) x;
間隔天 間隔月 間隔年
---------- ---------- ----------
2348 77.1935483 6.43279569
計(jì)算一年中周內(nèi)各日期的次數(shù)
問(wèn)題
計(jì)算一年中周內(nèi)各日期(星期日、星期一 ……星期六)的次數(shù)。
解決方案
要計(jì)算一年中周內(nèi)各日期分別有多少個(gè),必須:
- 生成一年內(nèi)的所有日期。
- 設(shè)置日期格式,得到每個(gè)日期對(duì)應(yīng)為星期幾。
- 計(jì)數(shù)周內(nèi)各日期分別有多少個(gè)。
with x as
(select level lvl
from dual
connect by level <=
(add_months(trunc(sysdate, 'y'), 12) - trunc(sysdate, 'y')))
select to_char(trunc(sysdate, 'y') + lvl - 1, 'DAY'), count(*)
from x
group by to_char(trunc(sysdate, 'y') + lvl - 1, 'DAY');

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- oracle 查詢當(dāng)天數(shù)據(jù)的sql條件寫(xiě)法
- oracle使用to_date查詢一周的第一天日期
- Oracle查詢最近幾天每小時(shí)歸檔日志產(chǎn)生數(shù)量的腳本寫(xiě)法
- oracle實(shí)現(xiàn)按天,周,月,季度,年查詢排序方法
- Oracle 獲取上周一到周末日期的查詢sql語(yǔ)句
- Oracle中查詢本月星期5的所有日期列表的語(yǔ)句
- oracle查詢截至到當(dāng)前日期月份所在年份的所有月份
- Oracle實(shí)現(xiàn)查詢2個(gè)日期所跨過(guò)的月份列表/日期列表的方法分析
- oracle實(shí)現(xiàn)動(dòng)態(tài)查詢前一天早八點(diǎn)到當(dāng)天早八點(diǎn)的數(shù)據(jù)功能示例
相關(guān)文章
Oracle針對(duì)數(shù)據(jù)庫(kù)某一行進(jìn)行操作的時(shí)候,如何將這一行加行鎖
Oracle針對(duì)數(shù)據(jù)庫(kù)某一行進(jìn)行操作的時(shí)候,如何將這一行加行鎖的實(shí)現(xiàn)方法2009-02-02
Oracle觸發(fā)器表發(fā)生了變化 觸發(fā)器不能讀它的解決方法(必看)
下面小編就為大家?guī)?lái)一篇Oracle觸發(fā)器表發(fā)生了變化 觸發(fā)器不能讀它的解決方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Oracle連接出現(xiàn)ora-12154無(wú)法解析指定的連接標(biāo)識(shí)符
這篇文章主要介紹了Oracle連接出現(xiàn)ora-12154無(wú)法解析指定的連接標(biāo)識(shí)符,需要的朋友可以參考下2017-03-03
Oracle DECODE 丟失時(shí)間精度的原因與解決方案
在Oracle數(shù)據(jù)庫(kù)中使用DECODE函數(shù)處理DATE類(lèi)型數(shù)據(jù)時(shí),可能會(huì)丟失時(shí)分秒信息,這主要是因?yàn)镈ECODE在處理時(shí)進(jìn)行了自動(dòng)類(lèi)型轉(zhuǎn)換,通常只比較日期部分,忽略時(shí)間部分,解決這一問(wèn)題的方法是使用CASE WHEN語(yǔ)句,它可以更精確地處理DATE類(lèi)型數(shù)據(jù),避免時(shí)間信息的丟失2024-10-10
oracle表空間的創(chuàng)建及dmp 文件的導(dǎo)入(推薦)
這篇文章主要介紹了oracle表空間的創(chuàng)建及dmp 文件的導(dǎo)入,需非常不錯(cuò),具有參考借鑒價(jià)值,要的朋友可以參考下2017-08-08
LINUX下Oracle數(shù)據(jù)庫(kù)用戶創(chuàng)建方法詳解
這篇文章主要介紹了LINUX下Oracle數(shù)據(jù)庫(kù)用戶創(chuàng)建方法,結(jié)合實(shí)例形式較為詳細(xì)的分析總結(jié)了Oracle數(shù)據(jù)庫(kù)用戶創(chuàng)建的具體步驟與相關(guān)技巧,需要的朋友可以參考下2015-12-12
Oracle備庫(kù)宕機(jī)啟動(dòng)的完美解決方案
這篇文章主要給大家介紹了關(guān)于Oracle備庫(kù)宕機(jī)啟動(dòng)的完美解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Oracle具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Oracle如何獲取指定表名稱批量修改表中的字段類(lèi)型
這篇文章主要給大家介紹了關(guān)于Oracle如何獲取指定表名稱批量修改表中字段類(lèi)型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)使用oracle具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08

