说明:本文总结自《Oracle Dateabase 11g SQL开发指南》 Jason Price著
■TO_CHAR(date [, format]) :
说明:将日期转换为字符串
format:将日期要转换成字符串的日期格式;
■TO_DATE(str [, date_fromat]) :
说明: 将字符串转换为日期
date_format字符串满足的日期格式;
注意:
1.对于两个函数若没有format参数,那么对应的参数应该与默认的日期格式相同,否则,会抛出错误;
2.对于日期格式化参数很多,但用法同上,具体有哪些可自行网搜;
实例:
--例1
select to_date('1994-01-08', 'YYYY-MM-DD') from dual;
--例2
select to_char(current_date, 'yyyy-mm-dd hh:mi:ss') from dual;
--以上语句都可直接执行,可自行实验
那么怎么知道默认的日期格式呢?
select snl_date_fromat from session;
为什么会有这个知识点,我们先来看看这个sql语句:
select to_char(to_date('94-06-12', 'yy-mm-dd'), 'yyyy-mm-dd') from dual;
你知道这句话的输出结果是什么吗?
鼠标放上来,查看结果
但是也许你的本意不是这样子的;
在日期格式中对于两位数的年份,oracle提供了两种:
1.YY:年份的或2位数字
2.RR:取整年份的最后两位数字,其值取决于当前年份。
有了上面的解释,就不能知道结果为什么是那样子了。那么对于RR的含义又是什么?就我的理解就是:
1.若当前年份与指定年份差不多,那么前两位年份就与当年相同;
2.若当前年份比指定年份小很多,那么前两位年份就是当前年份减1;
3.若当前年份比指定年份大很多,那么前两位年份就是当前年份加1;规则说明:这里说的大很多,小很多,差不多都是以50作为分界线的,例如,当年是2016,而指定年是75,那么就有指定年份1975;又如当年是2016,指定年是50,那么指定年就是2150;
若当年是2016,指定年是30,那么指定年就是2030年;
有了以上的规则说明之后,那么我们来看看下面这个sql语句的输出:
select to_char(to_date('94-06-12', 'rr-mm-dd'), 'yyyy-mm-dd') from dual;
--当年是2016年
鼠标放上来,查看结果
■ADD_MONTHS(date, m)
用于计算date加上m个月之后的结果,相应的,若m为负,则是减法;
select to_char(add_months(to_date('2016-10-01', 'yyyy-mm-dd'), 12), 'yyyy-mm-dd') from dual;
鼠标放上来,查看结果
■LAST_DAY(date)
用于计算date的月的最后一天;
select to_char(last_day(to_date('2016-10-01', 'yyyy-mm-dd')), 'yyyy-mm-dd') from dual;
鼠标放上来,查看结果
■MONTHS_BETWEEN(date1, date2)
用于计算两个日期之间相隔的月数;若要前者比后者早,那么返回负数;
select months_between(to_date('2016-10-01', 'yyyy-mm-dd'), to_date('2016-5-20', 'yyyy-mm-dd')) from dual;
鼠标放上来,查看结果
■NEXT_DAY(date, weekday)
计算从date开始,下一个星期几的日期,weekday是一个字符串;
select to_char(next_day(to_date('2016-10-13', 'yyyy-mm-dd'), '星期五'), 'yyyy-mm-dd') from dual;
鼠标放上来,查看结果
■ROUND(x [, unit])
根据unit来取最接近x的时间;unit对应的日期格式中的单位,如YYYY, MM, DD, HH等;
select to_char(
round(to_date('2010-10-10 14:45:12', 'yyyy-mm-dd hh24:mi:ss'),'hh24'),
'yyyy-mm-dd hh24:mi:ss')
from dual;
鼠标放上来,查看结果
■TRUNC(x [,unit])
用于对date日期进行截断,默认截断为当天的开始时间;
select to_char(
trunc(to_date('2016-01-10 11:25:14', 'yyyy-mm-dd hh:mi:ss'), 'hh'),
'yyyy-mm-dd hh:mi:ss')
from dual;
鼠标放上来,查看结果
三种类型
1.timestamp[(seconds_precision)] :seconds_precision,用于指定存储精度(0-9)
2.timestamp[(seconds_precision)] with time zone : 在原本的上面存储时区
3.timestamp[(seconds_precision)] with local time zone : 在原本的基础上存储本地时区
时间戳主要在建表时使用,可以把它理解成一种数据类型
如:
create table (
time_stamp timestamp(5) with time zone);
那么可不可以通过函数来获取时间戳呢?答案是可以的。
■current_timestamp(),返回一个timestamp with time zone的类型的值;
■localtimestamp,返回timestamp类型,包含当前会话的时间和日期
■systimestamp , 返回一个timestamp with time zone
■extract(……) , 用来提取时间戳中时间参数;
注:还有更多函数,在此不再列举
这是9i引入的一种新特性,用来存储时间间隔;同时间戳一样,我们可以理解为一种数据类型,使用方法也是建表时使用;
类型:
■interval year[(years_precision)] to month:
这种时间间隔,存储是?年?月的量级,要想数据库提供一个字面值,可以使用下面的简化语法:
interval ‘[+|-][x][-m]’ [year[(year_precision)]] [to month]
例:
interval '1' year :1年
interval '-11' month :-11月
interval '1-3' year to month : 1年3月
interval '13-1' year(1) to month :时间间隔无效
--使用实例:
insert into table_name values(interval '1' year);
■interval day[(days_precision)] to second[(seconds_precision)] :
同样,因为他提供了字面值简化语法:
interval ‘[+|-] [ d] [ h[: m[: s]]]’ [day[( days_precision)]]) [to hour | minute | second[( seconds_precision)]]
例:
interval '3' day : 3天
interval '2' hour : 2小时
interval '3 2:25' day to minute : 3天2小时25分
interval '3 2:25:45' day to second : 3天2小时25分45秒
相关函数
■numtodsinterval(x, interval_unit) :
将以interval_unit(day, hour, minute, second)指定值为单位的数字x转换为一个interval day to second 类型;
■numtoyminterval(x, interval_unit) :
将以interval_unit(year, month)指定值为单位的数字x转换为一个interval year to month类型;
■to_dsnterval(x) :
将字符串x转化为一个interval day to second 类型
■to_yminterval(x) :
将字符串x转化为一个interval year to month类型
补充:
获取系统日期的方式:
select sysdate from dual;
select current_date from dual;