Oracle中的 TO_DATE和 TO_CHAR函数日期处理
Oracle中的 TO_DATE和TO_CHAR函数
oracle中 TO_DATE函数的时间格式,以 2008-09-10 23:45:56 为例
格式说明显示值备注
Year(年):
yy two digits(两位年) 08
yyy
three digits(三位年) 008
yyyy four digits(四位年) 2008
Month(月):
mm number(两位月) 09
mon abbrevi ated(字符集表示) 9月若是英文版, 则显示 sep
month spelled out(字符集表示) 9月若是英文版, 则显示 septemb er
Day(日):
dd number(当月第几天) 10
ddd number(当年第几天) 254
dy abbrevi ated(当周第几天简写) 星期三若是英文版, 则显示 wed
day spelled out(当周第几天全写) 星期三若是英文版, 则显示 wednesd ay ddspthspelled out, ordinal twelfth tenth
Hour(时):
hh two digits(12小时进制) 11
hh24 two digits(24小时进制) 23
Minute(分):
mi two digits(60进制) 45
Second(秒):
ss two digits(60进制) 56
其他:
Q digit(季度) 3
WW digit(当年第几周) 37
W digit(当月第几周) 2
说明:
12小时格式下时间范围为: 1:00:00 - 12:59:59(12 小时制下的 12:59:59 对应 24 小时制下的 00:59:59)
24小时格式下时间范围为: 0:00:00 - 23:59:59
1. 日期和字符转换函数用法(to_date,to_char)
selectto_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串
selectto_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年
selectto_char(sysdate,'mm') as nowMont h from dual; //获取时间的月
selectto_char(sysdate,'dd') as nowDay from dual; //获取时间的日
selectto_char(sysdate,'hh24') as nowHour from dual; //获取时间的时
selectto_char(sysdate,'mi') as nowMinu te from dual; //获取时间的分
selectto_char(sysdate,'ss') as nowSeco nd from dual; //获取时间的秒
selectt o_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual//
2. selectto_char( to_date(222,'J'),'Jsp') from dual
显示Two Hundred Twenty-Two
3. 求某天是星期几
selectto_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;
星期一
selectto_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DAT E_L ANG UAGE = America n') from dual;
monday
设置日期语言
ALTER SESSION SET NLS_DAT E_LANG UAGE='AMERICA N';
也可以这样
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DAT E_LANG UAGE =
America n')
4. 两个日期间的天数
selectfloor(sysdate- to_date('20020405','yyyymmd d')) from dual;
5. 时间为null的用法
selectid, active_date from table1
UNION
select1, TO_DATE(null) from dual;
注意要用TO_DATE(null)
6.月份差
a_datebetween to_date('20011201','yyyymmd d') and
to_date('20011231','yyyymmd d')
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。
所以,当时间需要精确的时候,觉得to_ch ar还是必要的
7. 日期格式冲突问题
输入的格式要看你安装的OR ACLE字符集的类型, 比如: US7ASCI I, date格式的类型就是: '01-Jan-01'
alter systemset NLS_DAT E_LANG UAGE = America n
alter session set NLS_DAT E_LANG UAGE = America n
或者在to_d ate中写
selectto_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DAT E_ LANG UAGE = America n') from dual;
注意我这只是举了NLS_D ATE_LA NGUAGE,当然还有很多,
可查看
select* from nls_ses sion_p aramet ers
select* from V$NLS_PAR AMETER S
8.
selectcount(*)
from ( selectrownum-1 rnum
from all_obj ects
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_U TILITY.GET_TIM E, 让后将结果相减(得到的是1/100秒, 而不是毫秒).
9. 查月份
select
months_betwee n(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998 ','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1
select
months_betwee n(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998 ','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1.03225806451613
10. Next_da y的用法
Next_da y(date, day)
Monday-Sunday, for formatcode DAY
Mon-Sun, for formatcode DY
1-7, for formatcode D
11
selectto_char(sysdate,'hh:mi:ss') TIME from all_obj ects
注意:第一条记录的T IME 与最后一行是一样的
可以建立一个函数来处理这个问题
createor replace functio n sys_dat e returndate is
begin
returnsysdate;
end;
selectto_char(sys_dat e,'hh:mi:ss') from all_obj ects;
12.获得小时数
extract()出日期或间隔值的字段值
SELECTEXTRACT(HOUR FROM TIMESTA MP '2001-02-16 2:38:40') from offer
SQL> selectsysdate,to_char(sysdate,'hh') from dual;
SYSDATE TO_CHAR(SYSDATE,'HH')
-------------------- ---------------------
2003-10-13 19:35:21 07
SQL> selectsysdate,to_char(sysdate,'hh24') from dual;
SYSDATE TO_CHAR(SYSDATE,'HH24')
-------------------- -----------------------
2003-10-13 19:35:21 19
13.年月日的处理
selectolder_d ate,
newer_d ate,
years,
months,
abs(
trunc(
newer_d ate-
add_mon ths( older_d ate,years*12+months)
)
) days
from ( select
trunc(months_betwee n( newer_d ate, older_d ate )/12) YEARS,
mod(trunc(months_betwee n( newer_d ate, older_d ate )),12 ) MONTHS,
newer_d ate,
older_d ate
from (
selecthiredat eolder_d ate,
add_mon ths(hiredat e,rownum)+rownumn ewer_d ate
from emp
)
)
14.处理月份天数不定的办法
selectto_char(add_mon ths(last_da y(sysdate) +1, -2),
'yyyymmd d'),last_da y(sysdate) from dual
16.出今年的天数
selectadd_mon ths(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual
闰年的处理方法
to_char( last_da y( to_date('02' | | :year,'mmyyyy') ), 'dd' )
如果是28就不是闰年
<与rr rr的区别
'YYYY99TO_C
------- ----
yyyy 99 0099
rrrr 99 1999
yyyy 01 0001
rrrr 01 2001
oracle中trunc函数用法18.不同时区的处理
selectto_char( NEW_TIM E(sysdate, 'GMT','EST'),
'dd/mm/yyyyhh:mi:ss') ,sysdate
from dual;
19.5秒钟一个间隔
SelectTO_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.一年的第几天
selectTO_CHAR(SYSDATE,'DDD'),sysdate from dual
310 2002-11-6 10:03:51
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论