日期:2014-05-16  浏览次数:20419 次

Oracle 中的 TO_DATE 和 TO_CHAR 函数


oracle 中 TO_DATE 函数的时间格式,以 2008-09-10 234556 为例
格式 说明 显示值备注
Year(年)
yy two digits(两位年) 08
yyy
three digits(三位年) 008
yyyy four digits(四位年) 2008
Month(月)
mm number(两位月) 09
mon abbreviated(字符集表示) 9月 若是英文版, 则显示 sep
month spelled out(字符集表示) 9月 若是英文版, 则显示 september
Day(日)
dd number(当月第几天) 10
ddd number(当年第几天) 254
dy abbreviated(当周第几天简写) 星期三 若是英文版, 则显示 wed
day spelled out(当周第几天全写) 星期三 若是英文版, 则显示 wednesday
ddspth spelled 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小时格式下时间范围为: 10000 - 125959(12 小时制下的 125959 对应 24 小时制下的 005959)
24小时格式下时间范围为: 00000 - 235959
1. 日期和字符转换函数用法(to_date,to_char)
select to_char(sysdate,'yyyy-mm-dd hh24miss') as nowTime from dual; 日期转化为字符串
select to_char(sysdate,'yyyy') as nowYear from dual; 获取时间的年
select to_char(sysdate,'mm') as nowMonth from dual; 获取时间的月
select to_char(sysdate,'dd') as nowDay from dual; 获取时间的日
select to_char(sysdate,'hh24') as nowHour from dual; 获取时间的时
select to_char(sysdate,'mi') as nowMinute from dual; 获取时间的分
select to_char(sysdate,'ss') as nowSecond from dual; 获取时间的秒
select to_date('2004-05-07 132344','yyyy-mm-dd hh24miss') from dual
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, 让后将结果相减(得到的是1100秒, 而不是毫秒).
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
11
select to_char(sysdate,'hhmiss') TIME from all_objects
注意:第一条记录的TIME 与最后一行是一样的
可以建立一个函数来处理这个问题
create or replace function sys_date return date is
begin
return sysdate;
end;
select to_char(sys_date,'hhmiss') from all_objects;
12.获得小时数
extract()找出日期或间隔值的字段值
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2