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


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


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

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

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

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

- 例4_1:插入數據
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()只能格式化不帶毫秒級別的時間型字符串
- ⑴to_date()的作用是將字符串時間轉化為日期類型,日期類型就有年月日時分秒
2、如果字段是一個timetsmp類型的,那么就會默認毫秒級別為0
3、Oracle根據時間來查詢數據跟Mysql是有很大區(qū)別的
- ⑴在Mysql中可以直接根據時間字符串來進行查詢:SELECT * FROM roleinfo WHERE logintime = "2019-01-25";
- ⑵在Oracle中根據時間來查詢時,就必須先把時間字符串轉為date類型
4、小時格式化:不帶24時,默認為12小時制,24小時格式轉換時需要指明
- 例4_2:

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


- 例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、作用:將日期轉按一定格式換成字符類型
2、在格式化timestamp類型的時間值時,可以根據需要來格式化毫秒
- ⑴ff:6位毫秒值
- ⑵ff3:3位毫秒值
- ⑶也可以不帶毫秒值
3、如果是在格式化一個date類型的時間值時,那么用于格式字符串就不能加毫秒參數了,date類型中沒有毫秒
4、date類型只能精確到秒,要想精確到毫秒,需要使用timestamp類型
- 例5:查詢數據
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; --獲取時間的年 select to_char(sysdate,'mm') as nowMonth from dual; --獲取時間的月 select to_char(sysdate,'dd') as nowDay from dual; --獲取時間的日 select to_char(sysdate,'hh24') as nowHour from dual; --獲取時間的時 select to_char(sysdate,'mi') as nowMinute from dual; --獲取時間的分 select to_char(sysdate,'ss') as nowSecond from dual; --獲取時間的秒
- 例5_4:查詢數據



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

- 例6_1:插入數據


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

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

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

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

- 例8_1:

拓展
timestamp關鍵字
Oracle中還可以使用timestamp關鍵字來將將一個時間字符串值轉為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')

查詢數據庫系統(tǒng)時間
SELECT SYSDATE FROM DUAL select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual??????? --oracle中不能省略from關鍵字,dual???????這個表是oracle自帶的表,因此可以直接使用
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SQL Server、Oracle和MySQL判斷NULL的方法
本文講述SQL Server、Oracle、MySQL查出值為NULL的替換,在SQL Server Oracle MySQL當數據庫中查出某值為NULL怎么辦2012-11-11

