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' 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;
- Oracle 11g学习笔记--日期和时间的存储与处理
- Oracle Database 11g SQL 开发指南学习笔记:日期、时间的存储和处理
- 日期和时间的存储与处理
- 41.Oracle数据库SQL开发之 日期和时间的存储与处理——设置默认的日期格式
- 40.Oracle数据库SQL开发之 日期和时间的存储与处理——使用TO_CHAR和TO_DATE
- 39.Oracle数据库SQL开发之 日期和时间的存储与处理——几个简单的存储检索日期
- 编程学习笔记6--日期和时间的处理
- 43.Oracle数据库SQL开发之 日期和时间的存储与处理——使用时间值函数
- 44.Oracle数据库SQL开发之 日期和时间的存储与处理——理解时区
- 45.Oracle数据库SQL开发之 日期和时间的存储与处理——使用时间戳
- 46.Oracle数据库SQL开发之 日期和时间的存储与处理——使用时间间隔
- oracle的日期和时间的处理
- 42.Oracle数据库SQL开发之 日期和时间的存储与处理——Oracle对2位年份处理
- MySQL学习笔记八:日期/时间的处理
- ORACLE日期时间处理
- Oracle处理日期时间
- oracle中时间日期的处理
- Oracle 11g New 与分区和存储相关的增强功能
- go-sql-driver/mysql 学习
- 使用Intellij进行SpringMVC网站开发问题总结
- js、css引用地址后加时间戳
- 等待光标的两种实现方式
- dom4j在联网能正常解析,断网时解析报错的处理方法
- Oracle 11g学习笔记--日期和时间的存储与处理
- RecyclerView在5.0以上版本滑动不流畅(没有惯性效果)问题的处理
- 接雨水 lintcode
- 关于Java中==与equals的解析
- 并查集(Union-Find)算法介绍
- 从零开始玩转JMX(二)——Condition
- MyEclipse2014 删除Struts2中的antlr2.7.2.jar,解决Struts2和Hibernate中的antlr版本冲突
- 快速使用反射更换Android全局字体
- 校验器