cursor is oracle 日期_Oracle时间计算------日期格式参数含义说明
Oracle時間計算------日期格式參數含義說明
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?年中的第幾個星期
1.日期時間間隔操作
當前時間減去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.日期到字符操作
select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from
dual;
select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from
dual;
select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from
dual;
select sysdate,to_char(sysdate,'yyyy-mm iw-dhh:mi:ss') from
dual;
3. 字符到日期操作
select to_date('2003-10-17 21:15:37','yyyy-mm-dd hh24:mi:ss') from
dual
4. trunk/ ROUND函數的使用
select trunc(sysdate ,'YEAR') from dual;
select trunc(sysdate ) from dual;
select to_char(trunc(sysdate ,'YYYY'),'YYYY') from dual;
5.oracle有毫秒級的數據類型
--返回當前時間 年月日小時分秒毫秒
select to_char(current_timestamp(5),'DD-MON-YYYY HH24:MI:SSxFF')
from dual;
--返回當前 時間的秒毫秒,可以指定秒后面的精度(最大=9)
select to_char(current_timestamp(9),'MI:SSxFF') from dual;
6.計算程序運行的時間(ms)
declare type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin for I in 1 .. 1000 loop open l_rc for 'select object_name
from all_objects '|| 'where object_id = ' || i; fetch l_rc into
l_dummy; close l_rc;
end loop;
dbms_output.put_line ( round( (dbms_utility.get_time-l_start)/100,
2 ) || ' seconds...' );
end;
以24小時的形式顯示出來要用HH24
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from
dual;//mi是分鐘
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from
dual;//mm會顯示月份
add_months(d,n)?日期d加n個月
last_day(d)?包含d的月?的最后一天的日期
new_time(d,a,b)?a的日期和d在b的日期和
next_day(d,day)?比日期d,由day指定的周幾的日期
sysdate?當前的系日期和
greatest(d1,d2,...dn)?出的日期列表中最后的日期
least(d1,k2,...dn)?出的日期列表中最早的日期
to_char(d
[,fmt])?日期d按fmt指定的格式??成字符串
to_date(st
[,fmt])?字符串st按fmt指定的格式?成日期,若fmt忽略,st要用缺省格式
round(d
[,fmt])?日期d按fmt指定格式舍入到最近的日期
trunc(d
[,fmt])?日期d按fmt指定格式截斷到最近的日期
to_date?字符串類型轉為換日期類型
字符串中的相應位置上的字符,必須符合時間范圍的限制
查詢Oracle日期格式
----------------------------------
select * from nls_database_parameters;
得到結果如下表: 表中NLS_DATE_FORMAT表示日期格式.
PARAMETER VALUE
-----------------------------------
-----------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_NCHAR_CHARACTERSET ZHS16GBK
NLS_RDBMS_VERSION 8.1.7.0.0
或者查詢V$NLS_PARAMETERS表,
select * from V$NLS_PARAMETERS;
也有類似結果
SQL>select to_date('2004-11-12
12-07-32','yyyy-mm-dd hh24-mi-ss') value from dual;
VALUE
-------------------
2004.11.12 12:07:32
SQL>select to_date('20041015') value from
dual;
VALUE
-------------------
last_day 本月最后一天
SQL>select last_day(sysdate) value from dual;
VALUE
-------------------
2003.11.30 17:08:17
add_months(d,n) 日期d后推n個月
SQL>select add_months(sysdate,2) value from
dual;
VALUE
-------------------
2005.01.23 17:10:21
next_day(d,day) 日期d之后的第一周中,指定的那天(指定星期的第幾天)是什么日期
SQL>select next_day(sysdate,1) value from
dual;
VALUE
-------------------
2004.11.28 17:38:55
[oracle/plsql]oracle日期處理完全版
日期處理完全版
TO_DATE格式
Day:
dd number 12
dy abbreviated fri
day spelled out friday
ddspth spelled out, ordinal twelfth
Month:
mm number 03
mon abbreviated mar
month spelled out march
Year:
yy two digits 98
yyyy four digits 1998
24小時格式下時間范圍為: 0:00:00 - 23:59:59....
12小時格式下時間范圍為: 1:00:00 - 12:59:59 ....
1.日期和字符轉換函數用法(to_date,to_char)
2.select to_char( to_date(222,'J'),'Jsp') from dual
顯示Two Hundred Twenty-Two
3.求某天是星期幾
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from
dual;
星期一
Select
to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE
= American') from
dual;
monday
設置日期語言
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
也可以這樣
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE =
American')
4.兩個日期間的天數
select floor(sysdate - to_date('20020405','yyyymmdd')) from
dual;
5. 時間為null的用法
select id, active_date from table1
UNION
select 1, TO_DATE(null) from dual;
注意要用TO_DATE(null)
6.a_date between to_date('20011201','yyyymmdd') and
to_date('20011231','yyyymmdd')
那么12月31號中午12點之后和12月1號的12點之前是不包含在這個范圍之內的。
所以,當時間需要精確的時候,覺得to_char還是必要的
7. 日期格式沖突問題
輸入的格式要看你安裝的ORACLE字符集的類型, 比如: US7ASCII, date格式的類型就是:
'01-Jan-01'
alter system set NLS_DATE_LANGUAGE = American
alter session set NLS_DATE_LANGUAGE = American
或者在to_date中寫
select
to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE
= American') from dual;
注意我這只是舉了NLS_DATE_LANGUAGE,當然還有很多,
可查看
select * from nls_session_parameters
select * from V$NLS_PARAMETERS
8.select count(*) from ( select rownum-1 rnum from all_objects
where rownum <= to_date('2002-02-28','yyyy-mm-dd') -
to_date('2002- 02-01','yyyy-mm-dd')+1 ) where
to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not in
( '1', '7' )
查找2002-02-28至2002-02-01間除星期一和七的天數
在前后分別調用DBMS_UTILITY.GET_TIME, 讓后將結果相減(得到的是1/100秒, 而不是毫秒).
9.select months_between(to_date('01-31-1999','MM-DD-YYYY'),
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1
select months_between(to_date('02-01-1999','MM-DD-YYYY'),
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1.03225806451613
10. Next_day的用法
Next_day(date, day)
Monday-Sunday, for format code DAY
Mon-Sun, for format code DY
1-7, for format code D
11select to_char(sysdate,'hh:mi:ss') TIME from all_objects
注意:第一條記錄的TIME 與最后一行是一樣的
可以建立一個函數來處理這個問題
create or replace function sys_date return date is
begin
return sysdate;
end;
select to_char(sys_date,'hh:mi:ss') from all_objects;
12.獲得小時數
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from
offer
SQL> select sysdate ,to_char(sysdate,'hh') from
dual;
SYSDATE TO_CHAR(SYSDATE,'HH')
-------------------- ---------------------
2003-10-13 19:35:21 07
SQL> select sysdate ,to_char(sysdate,'hh24') from
dual;
SYSDATE TO_CHAR(SYSDATE,'HH24')
-------------------- -----------------------
2003-10-13 19:35:21 19
獲取年月日與此類似
13. 年月日的處理
select older_date, newer_date, years, months, abs( trunc(
newer_date- add_months( older_date,years*12+months ) ) ) days from
( select trunc(months_between( newer_date,
older_date )/12) YEARS, mod(trunc(months_between( newer_date,
older_date )), 12 ) MONTHS, newer_date, older_date from ( select
hiredate older_date, add_months
(hiredate,rownum)+rownum newer_date from emp ) )
14. 處理月份天數不定的辦法
select to_char(add_months(last_day(sysdate) +1, -2),
'yyyymmdd'),last_day(sysdate) from dual
15. 找出今年的天數
select add_months(trunc(sysdate,'year'), 12) -
trunc(sysdate,'year') from dual
16 閏年的處理方法
to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )
如果是28就不是閏年
17. yyyy與rrrr的區別
'YYYY99 TO_C
------- ----
yyyy 99 0099
rrrr 99 1999
yyyy 01 0001
rrrr 01 2001
18.不同時區的處理
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy
hh:mi:ss') ,sysdate
from dual;
19. 5秒鐘一個間隔
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS')
,TO_CHAR(sysdate,'SSSSS') from dual
2002-11-1 9:55:00 35786
SSSSS表示5位秒數
20. 一年的第幾天
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual
310 2002-11-6 10:03:51
21.計算小時,分,秒,毫秒
Select Days, A, TRUNC(A*24) Hours, TRUNC(A*24*60 - 60*TRUNC(A*24))
Minutes, TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
TRUNC(A*24*60*60*100 - 100*TRUNC
(A*24*60*60)) mSeconds from ( select trunc(sysdate) Days,
sysdate - trunc(sysdate) A from dual )
select * from tabname order by
decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');
//
floor((date2-date1) /365) 作為年
floor((date2-date1, 365) /30) 作為月
mod(mod(date2-date1, 365), 30)作為日.
23.next_day函數
next_day(sysdate,6)是從當前開始下一個星期五。后面的數字是從星期日開始算起。
計算時間差是OracleDATA數據類型的一個常見問題。Oracle支持日期計算,你可以創建諸如"日期1-日期2"這樣的表達式來計算這兩個日期之間的時間差。
一旦你發現了時間差異,你可以使用簡單的技巧來以天、小時、分鐘或者秒為單位來計算時間差。為了得到數據差,你必須選擇合適的時間度量單位,這樣就可以進行數據格式隱藏。
使用完善復雜的轉換函數來轉換日期是一個誘惑,但是你會發現這不是最好的解決方法。
round(to_number(end-date-start_date))-消逝的時間(以天為單位)
round(to_number(end-date-start_date)*24)-消逝的時間(以小時為單位)
round(to_number(end-date-start_date)*1440)-消逝的時間(以分鐘為單位)
顯示時間差的默認模式是什么?為了找到這個問題的答案,讓我們進行一個簡單的SQL*Plus查詢。
SQL>selectsysdate-(sysdate-3)fromdual;
SYSDATE-(SYSDATE-3)
-------------------
3
這里,我們看到了Oracle使用天來作為消逝時間的單位,所以我們可以很容易的使用轉換函數來把它轉換成小時或者分鐘。然而,當分鐘數不是一個整數時,我們就會遇到放置小數點的問題
。
Select
(sysdate-(sysdate-3.111))*1440
from
dual;
(SYSDATE-(SYSDATE-3.111))*1440
------------------------------
4479.83333
當然,我們可以用ROUND函數(即取整函數)來解決這個問題,但是要記住我們必須首先把DATE數據類型轉換成NUMBER數據類型。
Select
round(to_number(sysdate-(sysdate-3.111))*1440)
from
dual;
ROUND(TO_NUMBER(SYSDATE-(SYSDATE-3.111))*1440)
----------------------------------------------
4480
我們可以用這些函數把一個消逝時間近似轉換成分鐘并把這個值寫入Oracle表格中。在這個例子里,我們有一個離線(logoff)系統級觸發機制來計算已經開始的會話時間并把它放入一個
OracleSTATSPACKUSER_LOG擴展表格之中。
Update
perfstat.stats$user_log
set
elapsed_minutes=
round(to_number(logoff_time-logon_time)*1440)
where
user=user_id
and
elapsed_minutesisNULL;
總結
以上是生活随笔為你收集整理的cursor is oracle 日期_Oracle时间计算------日期格式参数含义说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索尼 PS 商城春季特卖活动开启,微信
- 下一篇: 浙江股票一览表