Oracle 11g学习笔记--日期和时间的存储与处理

来源:互联网 发布:淘宝上架宝贝教程2017 编辑:程序博客网 时间:2024/06/06 19:28

Oracle 11g学习笔记–日期和时间的存储与处理

说明:本文总结自《Oracle Dateabase 11g SQL开发指南》 Jason Price著

日期与字符串的相互转化

■TO_CHAR(date [, format]) :
说明:将日期转换为字符串
format:将日期要转换成字符串的日期格式;

■TO_DATE(str [, date_fromat]) :
说明: 将字符串转换为日期
date_format字符串满足的日期格式;

注意:
1.对于两个函数若没有format参数,那么对应的参数应该与默认的日期格式相同,否则,会抛出错误;
2.对于日期格式化参数很多,但用法同上,具体有哪些可自行网搜;

实例:

--例1select to_date('1994-01-08', 'YYYY-MM-DD') from dual;--例2select to_char(current_date, 'yyyy-mm-dd hh:mi:ss') from dual;--以上语句都可直接执行,可自行实验

那么怎么知道默认的日期格式呢?

    select snl_date_fromat from session;

Oracle对2位年份的处理

为什么会有这个知识点,我们先来看看这个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' year1年interval '-11' month :-11月interval '1-3' year to month13月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 : 32小时25分interval '3 2:25:45' day to second : 32小时2545

相关函数
■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;

0 0
原创粉丝点击