Oracle的to_d ate函数
日期格式参数含义说明
D 一周中的星期几
DAY天的名字,使用空格填充到9个字符
DD 月中的第几天
DDD 年中的第几天
DY天的简写名
IW ISO标准的年中的第几周
IYYY ISO标准的四位年份
YYYY四位年份
YYY,YY,Y年份的最后三位,两位,一位
HH 小时,按12小时计
HH24 小时,按24小时计
MI 分
SS 秒
MM 月
Mon 月份的简写注:在不同的语言下显示出来的数据不同,在中文下显示为5月,在英文下显示为MAY
Month月份的全名
W 该月的第几个星期
WW 年中的第几个星期
1.日期时间间隔操作
当前时间减去7分钟的时间
select sysdat e,sysdat e - interv al’7’MINUTE from dual
当前时间减去7小时的时间
select sysdat e - interv al’7’hourfromdual
当前时间减去7天的时间
select sysdat e - interv al’7’dayfromdual
当前时间减去7月的时间
select sysdat e,sysdat e - interv al’7’monthfrom dual
当前时间减去7年的时间
select sysdat e,sysdat e - interv al’7’yearfromdual
时间间隔乘以一个数字
select sysdat e,sysdat e - 8 *interv al’2’hourfromdual
2.日期到字符操作
select sysdat e,to_cha r(sysdat e,’yyyy-mm-ddhh24:mi:ss’)fromdual
select sysdat e,to_cha r(sysdat e,’yyyy-mm-ddhh:mi:ss’)fromdual
select sysdat e,to_cha r(sysdat e,’yyyy-dddhh:mi:ss’)fromdual
select sysdat e,to_cha r(sysdat e,’yyyy-mm iw-dhh:mi:ss’)fromdual
参考orac le的相关关文档(ORACLE901DO C/SERVER.901/A90125/SQL_EL EMENT S4.HTM#48515)
3. 字符到日期操作
select to_dat e(’2003-10-1721:15:37’,’yyyy-mm-dd hh24:mi:ss’)fromdual
具体用法和上面的to_char差不多。
4. trunk/ ROUND函数的使用
select trunc(sysdat e,’YEAR’)fromdual
select trunc(sysdat e ) from dual
select to_cha r(trunc(sysdat e,’YYYY’),’YYYY’)fromdual
--返回当前时间年月日小时分秒毫秒
select to_cha r(curren t_tim estam p(5),’DD-MON-YYYY HH24:MI:SSxFF’)fromdual;oracle中trunc函数用法
--返回当前时间的秒毫秒,可以指定秒后面的精度(最大=9)
select to_cha r(curren t_tim estam p(9),’MI:SSxFF’)fromdual;
6.计算程序运行的时间(ms)
declar e
type rc is ref cursor;
l_rc rc;
l_dumm y all_ob jects.object_name%type;
l_star t number defaul t dbms_u tili_ti me;
begin
for I in 1 .. 1000
loop
open l_rc for
’select object_name from all_ob jects’||
’whereobject_id = ’||i;
fetchl_rc into l_dumm y;
closel_rc;
end loop;
dbms_o utput.put_li ne
( round( (dbms_u tili_ti me-l_star t)/100, 2 ) ||
’secon’);
end;
======================================================================== ========
1.日期和字符转换函数用法(to_dat e,to_cha r)
2.select to_cha r( to_dat e(222,'J'),'Jsp') from dual (这个经典....)
显示TwoHundre d Twenty-Two
3.求某天是星期几 select to_cha r(to_dat e('2002-08-26','yyyy-mm-dd'),'day') from dual;
星期一
select to_cha r(to_dat e('2002-08-26','yyyy-mm-dd'),'day','NLS_DA TE_LA NGUAG E = Americ an') from dual;
monday
设置日期语言 ALTERSESSIO N SET NLS_DA TE_LA NGUAG E='AMERIC AN';
也可以这样TO_DAT E ('2002-08-26', 'YYYY-mm-dd', 'NLS_DA TE_LA NGUAG E = Americ an')
4.两个日期间的天数 select floor(sysdat e - to_dat e('20020405','yyyymm dd')) from dual;
5.时间为nul l的用法select id, active_date from table1
UNION
select 1, TO_DAT E(null) from dual;
注意要用TO_DATE(null)
6.a_date betwee n to_dat e('20011201','yyyymm dd') and to_dat e('20011231','yyyymm dd')
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。
所以,当时间需要精确的时候,觉得to_c har还是必要的
7. 日期格式冲突问题
输入的格式要看你安装的ORACL E字符集的类型, 比如: US7ASC II, date格式的类型就是: '01-Jan-01'
altersystem set NLS_DA TE_LA NGUAG E = Americ an
altersessio n set NLS_DA TE_LA NGUAG E = Americ an
或者在to_date中写select to_cha r(to_dat e('2002-08-26','yyyy-mm-dd'),'day','NLS_DA TE_LA NGUAG E = Americ an') from dual;
注意我这只是举了NLS_DATE_LANG UAGE,当然还有很多,
可查看 select * from nls_se ssion_para meter s
select * from V$NLS_PA RAMET ERS
8. select count(*)
from ( select rownum-1 rnum from all_ob jects
whererownum <= to_dat e('2002-02-28','yyyy-mm-dd') - to_dat e('2002-
02-01','yyyy-mm-dd')+1 )
whereto_cha r( to_dat e('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )
not in ( '1', '7' )
查2002-02-28至2002-02-01间除星期一和七的天数
在前后分别调用DBMS_UTIL ITY.GET_TI ME, 让后将结果相减(得到的是1/100秒, 而不是毫秒).
9. select months_betw een(to_dat e('01-31-1999','MM-DD-YYYY'),
to_dat e('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1
select months_betw een(to_dat e('02-01-1999','MM-DD-YYYY'),
to_dat e('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1.03225806451613
10. Next_d ay的用法 Next_d ay(date, day)
Monday-Sunday, for format code DAY
Mon-Sun, for format code DY
1-7, for format code D
11.select to_cha r(sysdat e,'hh:mi:ss') TIME from all_ob jects
注意:第一条记录的TIME与最后一行是一样的
可以建立一个函数来处理这个问题create or replac e functi on sys_da te return date is
begin
return sysdat e;
end;
select to_cha r(sys_da te,'hh:mi:ss') from all_ob jects;
12.获得小时数SELECT EXTRAC T(HOUR FROM TIMEST AMP '2001-02-16 2:38:40') from offer
SQL> select sysdat e ,to_cha r(sysdat e,'hh') from dual;
SYSDAT E TO_CHA R(SYSDAT E,'HH')
-------------------- ---------------------
2003-10-13 19:35:21 07
SQL> select sysdat e ,to_cha r(sysdat e,'hh24') from dual;
SYSDAT E TO_CHA R(SYSDAT E,'HH24')
-------------------- -----------------------
2003-10-13 19:35:21 19
获取年月日与此类似
13.年月日的处理 select older_date,
newer_date,
years,
months,
abs(
trunc(
newer_date-
add_mo nths( older_date,years*12+months )
)
) days
from ( select
trunc(months_betw een( newer_date, older_date)/12) YEARS,
mod(trunc(months_betw een( newer_date, older_date)),
12 ) MONTHS,
newer_date,
older_date
from ( select hireda te older_date,
add_mo nths(hireda te,rownum)+rownum newer_date
from emp )
)
14.处理月份天数不定的办法select to_cha r(add_mo nths(last_d ay(sysdat e) +1, -2), 'yyyymm dd'),last_d ay(sysdat e) from dual
15.出今年的天数select add_mo nths(trunc(sysdat e,'year'), 12) - trunc(sysdat e,'year') from dual
闰年的处理方法 to_cha r( last_d ay( to_dat e('02' || :year,'mmyyyy') ), 'dd' )
如果是28就不是闰年
<与r rrr的区别
'YYYY99 TO_C
------- ----
yyyy 99 0099
rrrr 99 1999
yyyy 01 0001
rrrr 01 2001
17.不同时区的处理select to_cha r( NEW_TI ME( sysdat e, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdat e
from dual;
18. 5秒钟一个间隔Select TO_DAT E(FLOOR(TO_CHA R(sysdat e,'SSSSS')/300) * 300,'SSSSS') ,TO_CHA R(sysdat e,'SSSSS')
from dual
2002-11-1 9:55:00 35786
SSSSS表示5位秒数
19.一年的第几天 select TO_CHA R(SYSDAT E,'DDD'),sysdat e from dual
310 2002-11-6 10:03:51
20.计算小时,分,秒,毫秒 select
Days,
A,
TRUNC(A*24) Hours,
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minute s,
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Second s,
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSecon ds
from
(
select
trunc(sysdat e) Days,
sysdat e - trunc(sysdat e) A
from dual
)
select * from tabnam e
orderby decode(mode,'FIFO',1,-1)*to_cha r(rq,'yyyymm ddhh24miss');
/
/
floor((date2-date1) /365) 作为年
floor((date2-date1, 365) /30) 作为月
mod(mod(date2-date1, 365), 30)作为日.
<_d ay函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论