oracle的timestamp型別使用

2021-08-26 03:50:29 字數 3372 閱讀 8405

我們都知道date和timestamp都是對日期和時間的表示,只是兩種型別的精確度不同,前者精確到秒,後者精確到小數秒(fractional_seconds_precision),可以是 0 to 9,預設是6。

但是對date型別的運算很簡單,有很多函式可用來處理;而兩個timestamp的差則是很直觀地顯示為多少天+多少小時+多少分鐘+多少秒+多少小數秒,

sql> create table test (t1 timestamp(6),

2 t2 timestamp(6));

表已建立。

sql> insert into test values(

2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),

3 to_timestamp('2006-01-01 12:20:10.2','yyyy-mm-dd hh24:mi:ss.ff'));

已建立 1 行。

sql>

sql> insert into test values(

2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),

3 to_timestamp('2006-01-02 12:20:10.2','yyyy-mm-dd hh24:mi:ss.ff'));

已建立 1 行。

sql>

sql> insert into test values(

2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),

3 to_timestamp('2006-01-02 13:40:20.2','yyyy-mm-dd hh24:mi:ss.ff'));

已建立 1 行。

sql> commit;

提交完成。

sql>

兩個timestamp的差則是很直觀地顯示為多少天+多少小時+多少分鐘+多少秒+多少小數秒:

sql> select t2-t1 from test;

+000000000 00:10:00.100000

+000000001 00:10:00.100000

+000000001 01:30:10.100000

sql>

但要簡單地轉化為某乙個精度卻比較麻煩,用類似date型別的處理方法是不行的。如轉化為分:

sql> select 1440*(t2-t1) from test;

+000000010 00:02:24.000000000

+000001450 00:02:24.000000000

+000001530 04:02:24.000000000

sql>

發現結果根本不是原先想要的,而是在原先的「多少天+多少小時+多少分鐘+多少秒+多少小數秒」的每一項都乘以1440再進行進製處理。

最容易理解的就是用substr將兩個timestamp的差進行分割轉化處理:

sql>  select substr((t2-t1),instr((t2-t1),' ')+7,2)         seconds,

2      substr((t2-t1),instr((t2-t1),' ')+4,2)         minutes,

3     substr((t2-t1),instr((t2-t1),' ')+1,2)         hours,

4     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' '))))  days,

5     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' ')))/7) weeks

6 from test;

seco minu hour days weeks

---- ---- ---- ---------- ----------

00 10 00 0 0

00 10 00 1 0

10 30 01 1 0

或者利用自定義函式來實現將天數轉換成「天時分秒」格式:

create or replace function f_days2str(p_days in number default 0)

return varchar2 is

--ver:1.0

--created by xsb on 2005-05-26

--for: 將天數轉換成天時分秒格式

days number := nvl(p_days, 0);

vd number;

--天vh number;

--小時

vm number;

--分vs number;

--秒result varchar2(

100);

--返回值

begin

vd := trunc(days);

vh := trunc((days - vd) *

24);

vm := trunc((days - vd - vh /

24) *

24*

60);

vs := trunc((days - vd - vh /

24- vm /

24/

60) *

24*

60*

60);

select decode(vd, 0,

'', vd ||

'天') || decode(vh, 0,

'', vh ||

'小時'

) ||decode(vm, 0,

'', vm ||

'分') || decode(vs, 0,

'', vs ||

'秒') into result from dual;

return(result);

end;

sql>

如果最後結果的精度要求不高時(在分或分以上時),就可以先將timestamp轉化為date再結算,這樣就簡單多了:

sql> select (to_date(to_char(t2,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'

)-to_date(to_char(t1,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'))*24*60

2 from test;

1530.16667

date轉換為timestamp:

select cast(sysdateas timestamp) from dual;

Oracle中date與timestamp的異同

在oracle中儲存date和時間資訊的話,實際上你有兩種字段資料型別的選擇 9i date資料型別 可以儲存月,年,日,世紀,時,分和秒。度量粒度是秒 以使用to char函式把date資料進行傳統地包裝,達到表示成多種格式的目的 select to char sysdate,mm dd yyyy...

oracle中date和timestamp的區別

如果你想在oracle中儲存date和時間資訊的話,實際上你由兩種字段資料型別的選擇的話,就讓我們看看這兩種資料型別的差別和它們提供了些什麼。date資料型別 這個資料型別我們實在是太熟悉了,當我們需要表示日期和時間的話都會想到date型別。它可以儲存月,年,日,世紀,時,分和秒。它典型地用來表示什...

mysql資料匯入遇到的timestamp型別問題

今天準備把最新的表匯入自己以前的機子上做臨時開發,在資料庫匯入的時候遇到乙個問題 incorrect table definition there can be only one timestamp column with current timestamp in default or on upd...