Oracle 中時間的計算

來源:互聯網
上載者:User

Oracle中表示時間有DATE和TIMESTAMP,DATE可以儲存年,月,日,小時,分鐘,秒.

TIMESTAMP是DATE的擴充,可以儲存年,月,日,小時,分鐘,秒,同時還可以儲存秒的小數部分.秒的小數部分可以為9位即納秒,預設為6為的微秒.

表示時間差的為INTERVAL:INTERVAL YEAR TO MONTH 和INTERVAL DAY TO SECOND兩種.

 

1,Date類型:sysdate和current_date

1. 日期格式參數 含義說明

D 一周中的星期幾,數字

DAY 一周中的星期幾的名字,使用空格填充到 9 個字元

DD 月中的第幾天

DDD 年中的第幾天

DY 一周中的星期幾的簡寫名

IW ISO 標準的年中的第幾周

IYYY ISO 標準的四位年份

YYYY 四位年份

YYY,YY,Y 年份的最後三位,兩位,一位

HH 小時,按 12 小時計

HH24 小時,按 24 小時計

MI 分

SS 秒

MM 月

Mon 月份的簡寫

Month 月份的全名

W 該月的第幾個星期

WW 年中的第幾個星期

 

從日期到字串操作:to_char(日期,日期格式參數).

例:

select sysdate,to_char(sysdate,'DD/MM/YYYY HH24:MI:SS') from dual
select sysdate,to_char(sysdate,'DD/MM/YYYY HH:MI:SS') from dual

select sysdate,to_char(sysdate,'DD/MON/YYYY') from dual
select sysdate,to_char(sysdate,'DDD') from dual

 

從字串到日期轉換:to_date(字串,日期格式參數).日期格式參數的組合要比to_char少.

例:

select to_date('2010/07/16 21:15:37','yyyy/mm/dd hh24:mi:ss') from dual

select to_date('198','DDD') from dual

 

兩個日期相減得到的是一個以天為單位的number,帶小數.

天:
ROUND(TO_NUMBER(DATE1 - DATE2))
小時:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24)
分鐘:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24 * 60)
秒:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24 * 60 * 60)
毫秒:
ROUND(TO_NUMBER(DATE1 - DATE2) * 24 * 60 * 60 * 1000)

 

日期和INTERVAL的操作:加減操作.

目前時間減去 7 分鐘的時間

select sysdate,sysdate - interval '7' MINUTE from dual

目前時間加 7 小時的時間

select sysdate + interval '7' hour from dual

目前時間減去 7 天的時間

select sysdate - interval '7' day from dual

目前時間減去 7 月的時間

select sysdate,sysdate - interval '7' month from dual

目前時間減去 7 年的時間

select sysdate,sysdate - interval '7' year from dual

時間間隔乘以一個數字

select sysdate,sysdate - 8 *interval '2' hour from dual

 

2,TIMESTAMP類型:systimestamp和CURRENT_TIMESTAMP.

FF [1..9]小數秒.

從字串到時間戳記操作:to_timestamp(字串,日期格式參數).

select to_timestamp('2010/07/16 21:15:37','yyyy/mm/dd hh24:mi:ss') from dual
select to_timestamp('2010/07/16 21:15:37.123456','yyyy/mm/dd hh24:mi:ss.ff') from dual

select to_timestamp('2010/07/16 21:15:37.123456789','yyyy/mm/dd hh24:mi:ss.ff9') from dual

 

從時間戳記到字串操作:to_char(時間戳記,日期格式參數).

select to_char(systimestamp,'yyyy/mm/dd hh24:mi:ss') from dual

select to_char(systimestamp,'yyyy/mm/dd hh24:mi:ss.ff7') from dual

select to_char(systimestamp,'DDD') from dual

 

將date轉為timestamp,轉後的的timestamp的小數秒為0:

select systimestamp ,CAST (sysdate  AS timestamp)  from dual

 

將timestamp轉為date,轉後的date可能和前面的date有一秒之差:

select sysdate,CAST (systimestamp  AS DATE)  from dual

 

兩個timestamp相減的結果是interval 格式為 "天 小時 分 秒 微妙" DAY TO Second 格式.

 

本文用到的表:

CREATE TABLE timetest
(
  ID         INTEGER,
  BEGINTMT   TIMESTAMP(6),
  ENDTMT     TIMESTAMP(6),
  BEGINDATE  DATE,
  ENDDATE    DATE
)

insert into timetest values(1,to_timestamp('2010/05/12 12:23:34:4500','yyyy/mm/dd hh24:mi:ss:ff4'),
to_timestamp('2010/05/13 13:34:45:5600','yyyy/mm/dd hh24:mi:ss:ff4'),
to_date('2010/05/12 12:23:34','yyyy/mm/dd hh24:mi:ss'),
to_date('2010/05/13 13:34:45','yyyy/mm/dd hh24:mi:ss'))

 

insert into timetest values(2,to_timestamp('2009/04/12 12:33:35:4600','yyyy/mm/dd hh24:mi:ss:ff4'),
to_timestamp('2010/05/13 13:34:45:5600','yyyy/mm/dd hh24:mi:ss:ff4'),
to_date('2009/05/12 12:23:34','yyyy/mm/dd hh24:mi:ss'),
to_date('2010/05/12 12:23:34','yyyy/mm/dd hh24:mi:ss'))

 

資料為:

select ID,BEGINTMT, ENDTMT, ENDTMT- BEGINTMT from timetest

ID    BEGINTMT                    ENDTMT                        ENDTMT-BEGINTMT
1    12/05/2010 12:23:34.450000    13/05/2010 13:34:45.560000    +01 01:11:11.110000
2    12/04/2009 12:33:35.460000    13/05/2010 13:34:45.560000    +396 01:01:10.100000

 

對相減的結果處理:

SELECT ENDTMT- BEGINTMT,substr((ENDTMT- BEGINTMT),instr((ENDTMT- BEGINTMT),' ')+7,2) seconds,
substr((ENDTMT- BEGINTMT),instr((ENDTMT- BEGINTMT),' ')+4,2)         minutes,
substr((ENDTMT- BEGINTMT),instr((ENDTMT- BEGINTMT),' ')+1,2)         hours,
trunc(to_number(substr((ENDTMT- BEGINTMT),1,instr(ENDTMT- BEGINTMT,' '))))  days,
trunc(to_number(substr((ENDTMT- BEGINTMT),1,instr(ENDTMT- BEGINTMT,' ')))/7) weeks
FROM timetest;

 

ENDTMT-BEGINTMT            SECONDS    MINUTES    HOURS    DAYS    WEEKS
+01 01:11:11.110000           11              11             01          1           0
+396 01:01:10.100000         10               01             01          396       56

 

INTERVAL YEAR TO MONTH資料類型:以下來源於 http://blog.chinaunix.net/u/19782/showart_212188.html

Oracle文法:
INTERVAL 'integer [- integer]' {YEAR | MONTH} [(precision)][TO {YEAR | MONTH}]
該資料類型常用來表示一段時間差, 注意時間差只精確到年和月. precision為年或月的精確域, 有效範圍是0到9, 預設值為2.
eg:
INTERVAL '123-2' YEAR(3) TO MONTH    
表示: 123年2個月, "YEAR(3)" 表示年的精度為3, 可見"123"剛好為3為有效數值, 如果該處YEAR(n), n<3就會出錯, 注意預設是2.
INTERVAL '123' YEAR(3)
表示: 123年0個月

INTERVAL '300' MONTH
表示: 300個月, 注意該處MONTH的預設精度為3啊.(select INTERVAL '1300' MONTH(4)   from dual)
INTERVAL '4' YEAR    
表示: 4年, 同 INTERVAL '4-0' YEAR TO MONTH 是一樣的
INTERVAL '50' MONTH    
表示: 50個月, 同 INTERVAL '4-2' YEAR TO MONTH 是一樣
INTERVAL '123' YEAR    
表示: 該處表示有錯誤, 123精度是3了, 但系統預設是2, 所以該處應該寫成 INTERVAL '123' YEAR(3) 或"3"改成大於3小於等於9的數值都可以的
INTERVAL '5-3' YEAR TO MONTH + INTERVAL '20' MONTH =
INTERVAL '6-11' YEAR TO MONTH
表示: 5年3個月 + 20個月 = 6年11個月

 

 

INTERVAL DAY TO SECOND資料類型 以下來源於http://blog.chinaunix.net/u/19782/showart_212191.html
Oracle文法:
INTERVAL '{ integer | integer time_expr | time_expr }'
{ { DAY | HOUR | MINUTE } [ ( leading_precision ) ]
| SECOND [ ( leading_precision [, fractional_seconds_precision ] ) ] }
[ TO { DAY | HOUR | MINUTE | SECOND [ (fractional_seconds_precision) ] } ]

leading_precision值的範圍是0到9, 預設是2. time_expr的格式為:HH[:MI[:SS[.n]]] or MI[:SS[.n]] or SS[.n], n表示微秒.
範圍值:
HOUR:    0 to 23
MINUTE: 0 to 59
SECOND: 0 to 59.999999999
eg:
INTERVAL '4 5:12:10.222' DAY TO SECOND(3)
表示: 4天5小時12分10.222秒
INTERVAL '4 5:12' DAY TO MINUTE
表示: 4天5小時12分
INTERVAL '400 5' DAY(3) TO HOUR
表示: 400天5小時, 400為3為精度,所以"DAY(3)", 注意預設值為2.
INTERVAL '400' DAY(3)
表示: 400天
INTERVAL '11:12:10.2222222' HOUR TO SECOND(7)
表示: 11小時12分10.2222222秒
INTERVAL '11:20' HOUR TO MINUTE
表示: 11小時20分
INTERVAL '10' HOUR
表示: 10小時
INTERVAL '10:22' MINUTE TO SECOND
表示: 10分22秒
INTERVAL '10' MINUTE
表示: 10分
INTERVAL '4' DAY
表示: 4天
INTERVAL '25' HOUR
表示: 25小時
INTERVAL '40' MINUTE
表示: 40分
INTERVAL '120' HOUR(3)
表示: 120小時
INTERVAL '30.12345' SECOND(2,4)    
表示: 30.1235秒, 因為該地方秒的後面精度設定為4, 要進行四捨五入.
INTERVAL '20' DAY - INTERVAL '240' HOUR = INTERVAL '10-0' DAY TO SECOND
表示: 20天 - 240小時 = 10天0秒

 

和interval相關的函數:

NUMTODSINTERVAL(n, 'interval_unit')
將n轉換成interval_unit所指定的值, interval_unit可以為: DAY, HOUR, MINUTE, SECOND
注意該函數不可以轉換成YEAR和MONTH的.

select numtodsinterval(100,'DAY') + numtodsinterval(10,'MINUTE')  from dual;

 

NUMTOYMINTERVAL(n, 'interval_unit')
interval_unit可以為: YEAR, MONTH

select NUMTOYMINTERVAL(100,'YEAR') + NUMTOYMINTERVAL(10,'MONTH')  from dual;

 

兩個函數的結果不能進行加減操作:下面的操作不合法.

select  NUMTOYMINTERVAL(100,'YEAR')+ numtodsinterval(10,'MINUTE')  from dual;

 

對於時間的比較,今天比昨天大,今天減昨天為正數.

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.