Oracle中的時(shí)間類型使用及說明
Oracle中的時(shí)間類型
1、Oracle中的時(shí)間類型只有date和TIMESTAMP,TIMESTAMP是比date更精確的類型
⑴DATE類型:ORACLE最常用的日期類型,它可以保存日期和時(shí)間,常用日期處理都可以采用這種類型
⑵TIMESTAMP類型:ORACLE常用的日期類型,它與date的區(qū)別是TIMESTAMP類型不僅可以保存日期和時(shí)間,還能保存小數(shù)秒,小數(shù)位數(shù)可以指定為0-9,默認(rèn)為6位
2、日期時(shí)間函數(shù)用于處理時(shí)間類型的數(shù)據(jù),Oracle中提供了很多和日期相關(guān)的函數(shù)。并且包括了日期的加減,在日期的加減是有一些規(guī)律
⑴日期 - 數(shù)字 = 日期
⑵日期 + 數(shù)字 = 日期(天)
⑶日期 - 日期 = 數(shù)字(天)
⑷在Oracle中,date類型可以直接進(jìn)行加減天數(shù),而加減月份要用add_months函數(shù)
⑸TIMESTAMP日期類型如果與數(shù)值進(jìn)行加減運(yùn)算會(huì)自動(dòng)轉(zhuǎn)換為DATE型,也就是說小數(shù)秒會(huì)自動(dòng)去除
3、在Oracle中準(zhǔn)確來說一個(gè)禮拜是從星期日開始到星期六結(jié)束的,其中時(shí)間差以天數(shù)為單位
Oracle中的date類型
date類型:表示年月日時(shí)分秒
⑴其展示格式既可以為:YYYY/MM/DD,也可以為YYYY/MM/DD HH24:MI:SS
⑵其存儲(chǔ)格式只有一種:YYYY/MM/DD HH24:MI:SS
⑶即,date類型的值在數(shù)據(jù)庫(kù)圖形界面中可以有不同的顯示格式(具體的顯示格式由工具設(shè)置決定),但其實(shí)際儲(chǔ)存的格式只有一種
⑷當(dāng)你只存年月日時(shí),date實(shí)際存儲(chǔ)的是:年月日0時(shí)0分0秒,在plsql中,其展示格式為:YYYY/MM/DD
- 例1:


Oracle中的timestamp類型
1、date和timestamp都是對(duì)日期和時(shí)間的表示,只是兩種類型的精確度不同,前者精確到秒,后者精確到小數(shù)秒
2、timestamp簡(jiǎn)稱時(shí)間戳。時(shí)間戳可以存儲(chǔ)世紀(jì)、4位年、月、日、時(shí)(以24小時(shí)格式)、分、秒。與DATE類型相比,時(shí)間戳具有以下優(yōu)點(diǎn):
⑴時(shí)間戳可以存儲(chǔ)秒的小數(shù)位
⑵時(shí)間戳可以存儲(chǔ)時(shí)區(qū)
3、TIMESTAMP數(shù)據(jù)類型,它包括了所有DATE數(shù)據(jù)類型的年月日時(shí)分秒的信息,而且包括了小數(shù)秒的信息。如果想把DATE類型轉(zhuǎn)換成TIMESTAMP類型,就使用CAST函數(shù)
Oracle中的日期格式
| 格式 | 描述 |
| YYYY | 四位表示的年份 |
| YYY,YY,Y | 年份的最后三位、兩位或一位,缺省為當(dāng)前世紀(jì) |
| MM | 01~12的月份編號(hào) |
| MONTH | 九個(gè)字符表示的月份,右邊用空格填補(bǔ) |
| MON | 三位字符的月份縮寫 |
| WW | 一年中的星期 |
| D | 星期中的第幾天 |
| DD | 月份中的第幾天 |
| DDD | 年所中的第幾天 |
| DAY | 九個(gè)字符表示的天的全稱,右邊用空格補(bǔ)齊 |
| HH,HH12 | 一天中的第幾個(gè)小時(shí),12進(jìn)制表示法 |
| HH24 | 一天中的第幾個(gè)小時(shí),取值為00~23 |
| MI | 一小時(shí)中的分鐘 |
| SS | 一分鐘中的秒 |
| SSSS | 從午夜開始過去的秒數(shù) |
Oracle時(shí)間函數(shù)
sysdate
作用:sysdate函數(shù)用于返回當(dāng)前系統(tǒng)的時(shí)間(返回date數(shù)據(jù)類型)
- 例2:查詢


- 例2_1:插入
sql:insert into USER_INFO (ID,NAME,COUNTRY,DATE_TIME,TIMESTAMP) values(3,'王五','China',sysdate,sysdate)

systimestamp
作用:在Oracle中,systimestamp函數(shù)返回本機(jī)數(shù)據(jù)庫(kù)上當(dāng)前系統(tǒng)日期和時(shí)間(包括微秒和時(shí)區(qū))
- 例3:查詢

- 例3_1:插入
insert into USER_INFO (ID,NAME,COUNTRY,DATE_TIME,TIMESTAMP) values(4,'李六','China',systimestamp,systimestamp)

注:可以看出
sysdate函數(shù)最好用于date類型的數(shù)據(jù),systimestamp最好用于timestamp類型的數(shù)據(jù)。當(dāng)然兩種可以混用,只是說有點(diǎn)小差別
to_date()
作用:將字符類型按一定格式轉(zhuǎn)化為日期類型
- 例4:查詢數(shù)據(jù)

- 例4_1:插入數(shù)據(jù)
INSERT INTO USER_INFO (ID,NAME,CREATE_TIME,UPDATE_TIME) VALUES (9,'小m',to_date('2020-07-29 18:00:00','yyyy-mm-dd hh24:mi:ss'),to_date('2020-07-29 18:00:00','yyyy-mm-dd hh24:mi:ss'))
注:
1、to_date()只能格式化不帶毫秒級(jí)別的時(shí)間型字符串
- ⑴to_date()的作用是將字符串時(shí)間轉(zhuǎn)化為日期類型,日期類型就有年月日時(shí)分秒
2、如果字段是一個(gè)timetsmp類型的,那么就會(huì)默認(rèn)毫秒級(jí)別為0
3、Oracle根據(jù)時(shí)間來查詢數(shù)據(jù)跟Mysql是有很大區(qū)別的
- ⑴在Mysql中可以直接根據(jù)時(shí)間字符串來進(jìn)行查詢:SELECT * FROM roleinfo WHERE logintime = "2019-01-25";
- ⑵在Oracle中根據(jù)時(shí)間來查詢時(shí),就必須先把時(shí)間字符串轉(zhuǎn)為date類型
4、小時(shí)格式化:不帶24時(shí),默認(rèn)為12小時(shí)制,24小時(shí)格式轉(zhuǎn)換時(shí)需要指明
- 例4_2:

to_timestamp()
作用:將字符類型按一定格式轉(zhuǎn)化為日期時(shí)間戳類型(timestamp類型)
- 例4_3:查詢數(shù)據(jù)


- 例4_4:
insert into user_info (ID,
NAME,
COUNTRY,
DATE_TIME,
TIMESTAMP,
DEPT_ID,
EMPLOYEE_NO,
LEADER_NO) values (6,'LL','yy',to_timestamp('2020-07-30 20:30:30.123400','yyyy-mm-dd hh24:mi:ss.ff'),to_timestamp('2020-07-30 20:30:30.123','yyyy-mm-dd hh24:mi:ss.ff3'),1,1,1)
to_char()
1、作用:將日期轉(zhuǎn)按一定格式換成字符類型
2、在格式化timestamp類型的時(shí)間值時(shí),可以根據(jù)需要來格式化毫秒
- ⑴ff:6位毫秒值
- ⑵ff3:3位毫秒值
- ⑶也可以不帶毫秒值
3、如果是在格式化一個(gè)date類型的時(shí)間值時(shí),那么用于格式字符串就不能加毫秒?yún)?shù)了,date類型中沒有毫秒
4、date類型只能精確到秒,要想精確到毫秒,需要使用timestamp類型
- 例5:查詢數(shù)據(jù)
select to_char(CREATE_TIME,'yyyy-mm-dd hh24:mi:ss'),to_char(UPDATE_TIME,'yyyy-mm-dd hh24:mi:ss.ff') from USER_INFO where CREATE_TIME > to_date('2020-07-29 19:00:00','yyyy-mm-dd hh24:mi:ss');
- 例5_1:不帶毫秒

- 例5_2:帶3位毫秒

- 例5_3:其他
select to_char(sysdate,'yyyy') as nowYear from dual; --獲取時(shí)間的年 select to_char(sysdate,'mm') as nowMonth from dual; --獲取時(shí)間的月 select to_char(sysdate,'dd') as nowDay from dual; --獲取時(shí)間的日 select to_char(sysdate,'hh24') as nowHour from dual; --獲取時(shí)間的時(shí) select to_char(sysdate,'mi') as nowMinute from dual; --獲取時(shí)間的分 select to_char(sysdate,'ss') as nowSecond from dual; --獲取時(shí)間的秒
- 例5_4:查詢數(shù)據(jù)



注:
雖然sysdate、systimestamp、to_date()、to_timestamp()都可以用于生成一個(gè)date類型或timestamp類型,但是會(huì)有默認(rèn)的一些差距。因此還是不要混用的好,字段本身是什么類型就使用對(duì)應(yīng)類型的函數(shù)來創(chuàng)建一個(gè)時(shí)間值
⑴生成一個(gè)date類型:使用sysdate或to_date()
⑵生成一個(gè)timestamp類型:使用systimestamp或to_timestamp()
⑶將一個(gè)date類型或timestamp類型的時(shí)間值轉(zhuǎn)為字符串型:使用to_char(),只是說在指定格式化格式時(shí)需要區(qū)分好
Oracle日期加減
Oracle中日期類型進(jìn)行加減可以使用多種方式,以下介紹三種
- ⑴一種是針對(duì)天的操作:適用于對(duì)日,時(shí),分,秒的操作
- ⑵一種是對(duì)月的操作:適用于月,年的操作
- ⑶一種是使用INTERVAL函數(shù):適用于年,月,日,時(shí),分,秒的操作
直接加減數(shù)字
1、針對(duì)天的加減主要是在sysdate上直接進(jìn)行日,時(shí),分,秒的加減
2、Oracle中使用sysdate函數(shù)來獲取當(dāng)前系統(tǒng)時(shí)間
| 方法 | 描述 |
| SYSDATE | 當(dāng)前時(shí)間 |
| SYSDATE+1 | 加一天 |
| SYSDATE+(1/24) | 加一小時(shí) |
| SYSDATE+(1/24/60) | 加一分鐘 |
| SYSDATE+(1/24/60/60) | 加一秒鐘 |
| SYSDATE-1 | 減一天 |
- 例6:查詢數(shù)據(jù)

- 例6_1:插入數(shù)據(jù)


通過ADD_MONTHS()函數(shù)
| 方法 | 描述 |
| ADD_MONTHS(SYSDATE, 1) | 加一月 |
| ADD_MONTHS(SYSDATE, -1) | 減一月 |
| ADD_MONTHS(SYSDATE, 1*12) | 加一年 |
| ADD_MONTHS(SYSDATE, -1*12) | 減一年 |
使用INTERVAL函數(shù)
| 方法 | 描述 |
| SYSDATE + INTERVAL '1' YEAR | 加一年 |
| SYSDATE + INTERVAL '-1' YEAR | 減一年 |
| SYSDATE + INTERVAL '1' MONTH | 加一月 |
| SYSDATE + INTERVAL '1' DAY | 加一天 |
| SYSDATE + INTERVAL '1' HOUR | 加一小時(shí) |
| SYSDATE + INTERVAL '1' MINUTE | 加一分鐘 |
| SYSDATE + INTERVAL '1' SECOND | 加一秒 |
trunc()函數(shù)
說明:Oracle中的trunc()函數(shù)是對(duì)時(shí)間類型或者數(shù)字進(jìn)行截取操作的
語法:TRUNC(number,num_digits)
參數(shù):
⑴Number:需要截尾取整的數(shù)字或時(shí)間
⑵Num_digits:用于指定取整精度的數(shù)字。Num_digits的默認(rèn)值 0
注:
1、TRUNC()函數(shù)截取時(shí)不進(jìn)行四舍五入
2、to_char函數(shù)支持date和timestamp,但是trunc卻不支持TIMESTAMP數(shù)據(jù)類型
處理日期
TRUNC()函數(shù)對(duì)于日期的處理方式為:截取的部分保留其值,不截取的部分保存為0
| 方法 | 描述 |
| trunc(sysdate,'dd') | 返回當(dāng)前年月日(精確到天) |
| trunc(sysdate,'hh') | 返回當(dāng)前時(shí)間的年月日時(shí)部分(精確到小時(shí)) |
| trunc(sysdate,'mi') | 返回當(dāng)前時(shí)間的年月日時(shí)分部分(精確到分鐘,沒有精確到秒的) |
| trunc(sysdate,'mm') | 返回當(dāng)月第一天 |
| trunc(sysdate,'yy') | 返回當(dāng)年第一天 |
| trunc(sysdate,'yyyy') | 返回當(dāng)年第一天 |
| trunc(sysdate,'d') | 返回當(dāng)前星期的第一天(星期天) |
- 例7:dd
INSERT INTO USER_INFO(ID,NAME,CREATE_TIME,UPDATE_TIME) VALUES(5,'小紅',trunc(sysdate,'dd'),trunc(sysdate,'dd')); --精確到天,則時(shí)間秒值都為0

- 例7_1:
INSERT INTO USER_INFO(ID,NAME,CREATE_TIME,UPDATE_TIME) VALUES(6,'小明',trunc(sysdate,'hh'),trunc(sysdate,'hh')); --精確到小時(shí),則分秒值為0

- 例7_2:sysdate還可以進(jìn)行時(shí)間的加減
--在截取時(shí)間后,進(jìn)行時(shí)間的加減 INSERT INTO USER_INFO(ID,NAME,CREATE_TIME,UPDATE_TIME) VALUES(7,'小張',(trunc(sysdate,'hh')+2/24),(trunc(sysdate,'hh')+30/24/60));

處理數(shù)值
1、TRUNC(n1, n2): 用來根據(jù)n2截取n1并返回結(jié)果,n2可省略。截取數(shù)值是不進(jìn)行四舍五入
2、n2參數(shù)可以為正數(shù)也可以為負(fù)數(shù)
- ⑴負(fù)數(shù)表示從小數(shù)點(diǎn)左邊第一位截取后面全置為零
- ⑵正數(shù)表示小數(shù)點(diǎn)后面保留一位
- ⑶截取整數(shù)部分:可以不傳n2參數(shù)也可以傳N2=0
- 例8:

- 例8_1:

拓展
timestamp關(guān)鍵字
Oracle中還可以使用timestamp關(guān)鍵字來將將一個(gè)時(shí)間字符串值轉(zhuǎn)為date類型
- 例9:
insert into USER_INFO (ID,NAME,COUNTRY,DATE_TIME,TIMESTAMP) values(4,'李六','China',timestamp '2020-07-30 20:30:30',timestamp '2020-07-30 20:30:30.55555')

查詢數(shù)據(jù)庫(kù)系統(tǒng)時(shí)間
SELECT SYSDATE FROM DUAL select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual??????? --oracle中不能省略from關(guān)鍵字,dual???????這個(gè)表是oracle自帶的表,因此可以直接使用
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
DBF 文件恢復(fù) ORACLE 數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了DBF 文件 ORACLE 數(shù)據(jù)庫(kù)恢復(fù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
解決navicat 鏈接oracle時(shí)出現(xiàn)的各種問題
這篇文章主要介紹了解決navicat 鏈接oracle時(shí)出現(xiàn)的各種問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
Oracle的RBO和CBO詳細(xì)介紹和優(yōu)化模式設(shè)置方法
這篇文章主要介紹了Oracle的RBO和CBO詳細(xì)介紹和優(yōu)化模式設(shè)置方法,RBO即基于規(guī)則的優(yōu)化方式(Rule-Based Optimization),CBO即基于代價(jià)的優(yōu)化方式(Cost-Based Optimization),需要的朋友可以參考下2014-07-07
Oracle實(shí)現(xiàn)透明數(shù)據(jù)加密的代碼示例
透明數(shù)據(jù)加密(TDE)是一種用于保護(hù)數(shù)據(jù)庫(kù)中靜態(tài)數(shù)據(jù)的加密技術(shù),TDE通過自動(dòng)加密數(shù)據(jù)庫(kù)文件和日志文件,確保數(shù)據(jù)在磁盤上是加密的,從而防止未經(jīng)授權(quán)的訪問,以下以 Microsoft SQL Server 為例,實(shí)現(xiàn) TDE 的步驟和代碼示例,需要的朋友可以參考下2024-09-09
解決線上Oracle連接耗時(shí)過長(zhǎng)的問題現(xiàn)象
這篇文章主要介紹了記一次線上Oracle連接耗時(shí)過長(zhǎng)的問題,本文通過問題定位分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
oracle—SQL技巧之(二)WMSYS.WM_CONCAT函數(shù)實(shí)現(xiàn)多行記錄用逗號(hào)拼接在一起
由于業(yè)務(wù)系統(tǒng)的交易記錄有很多,常常有些主管需要看到所有的記錄情況;又不想滾動(dòng);接下來介紹使用Oracle自帶的函數(shù) WMSYS.WM_CONCAT,進(jìn)行拼接,感興趣的朋友可以了解下2013-01-01

