设为首页 收藏本站
查看: 1053|回复: 0

[经验分享] Oracle中的日期类型及相关函数

[复制链接]

尚未签到

发表于 2016-7-24 12:05:24 | 显示全部楼层 |阅读模式
Oracle中的日期类型及其相关的函数(2010-07-16 09:36:35)
转载标签: 杂谈 分类: oracle  
Oracle中的日期类型及其相关的函数

Oracle提供了很多的内置的日期类型,包括如下几种:
Date
Timestamp
Timestamp With Time Zone
Timestamp With Local Time Zone
Interval Year To Month
Interval Day To Second

Date类型用于存储日期,精确到秒,可能通过设置NLS_DATE_FORMAT或者TO_CHAR方法来格式化日期的输出。

Timestamp用于存在日期与时间信息,这个类型比Date更精确,最小能精确到小数点后9位。下面是一个例子:

scott@ORCL> select nowDate,nowTimestamp from testtime;

NOWDATE   NOWTIMESTAMP
--------- -------------------------------
24-NOV-08 24-NOV-08 10.36.59.000000000 PM

Timestamp With Time Zone类型与Timestamp非常相似,只是是按照指定时区进行显示。

Timestamp With Local Time Zone  类型以上面的更加相似,这里是按照当前时区显示时间。
下面是一个例子:

scott@ORCL>select * from testtime;

NOWDATE   NOWTIMESTAMP                  TIMEWITHZONE            TIMEWITHLOCALZONE
--------- ----------------------------------- -----------------------------------
24-NOV-08 24-NOV-08 10.44.55.000000000 PM     24-NOV-08 10.44.55.000000 PM +08:00 24-NOV-08 10.44.55.000000 PM

可以使用ALTER SESSION SET来设置Timestamp的输出,如:

scott@ORCL> ALTER SESSION SET NLS_DATE_FORMAT =
                          'YYYY-MM-DD HH24:MI:SS';
Session altered.
scott@ORCL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT
                      = 'YYYY-MM-DD HH24:MI:SS.FF';
Session altered.
scott@ORCL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT
                     = 'YYYY-MM-DD HH24:MI:SS.FFTZH:TZM';
Session altered.

scott@ORCL>/

NOWDATE         NOWTIMESTAMP            TIMEWITHZONE                TIMEWITHLOCALZONE
------------------- ------------------------------ ----------------------------------- ------------------------
2008-11-24 22:44:55 2008-11-24 22:44:55.000000000   2008-11-24 22:44:55.000000+08:00    2008-11-24 22:44:55.000000

Interval Year[(precision)] To Month类型用来表示一段以年和月为单位时间,主要用来表达两个时间之间的间隔,如1年又3个月。在year上面可以设定一个精确度,取值为0-9,默认的值为2。

Interval Day[(precision)] To Second 与上面的类型类似,主要用来表示以天,小时,分钟,秒为单位的一段时间。在day上面可以设定一个精确度,取值为0-9,不设定时默认为6。
这两个Interval类型可以进行加,减,乘,除运算。下面通过两个例子来看看这两种类型如何工作:
scott@ORCL>create table test_interval(ts1 timestamp(2),y2m interval year(4) to month,d2s interval day(4) to second);

Table created

scott@ORCL>insert into test_interval values(systimestamp,to_YMInterval('4-7'),to_DSInterval('5 02:20:30.30));

scott@ORCL> select * from test_interval;

TS1              Y2M         D2S
------------------------- ---------- ------------------------------
2008-11-24 23:06:10.71      +0004-07    +0005 02:20:30.300000

通过上面例子可以看到,to_YMInterval()和 to_DSInterval()方法能将一个字符串转换成Interval类型
下面这个例子展示一下这个类型的使用方法:

scott@ORCL>  select sysdate,sysdate+t.y2m,sysdate+t.d2s from test_interval t;

SYSDATE         SYSDATE+T.Y2M    SYSDATE+T.D2S
------------------- ------------------- -------------------
2008-11-24 23:25:02 2013-06-24 23:25:02 2008-11-29 01:45:32

从上面的查询可以看到,sysdate+t.y2m在当时时间上增加了4年又7个月,sysdate+t.d2s在当时时间上增加了5天,2小时,20分,30秒。


下面看看Oracle提供的与日期相关的函数
Trunc(date [,fmt])          这个函数用来截取日期,精度由fmt控制
To_Timestamp(var1,fmt)     将字符串转换成Timestamp类型
TO_DATE(var1,fmt)          将字符串转换成Date类型
Add_months(date,n)         增加n个月,为负数时是减少n个月
Last_day(date)             当月的最后一天,可通过与Add_months结合取得其它的月的最后一天
Month_between(date,date)   返回两个时间的相关的月数
Next_day(date,dow)        dow表示星期几,返回date的下一个dow的日期
Round(date [,fmt])         和数据的Round类似,fmt表示Round的精度,默认为天,如HH24,DD等
Extract(var from date)     从date中取出相应的年,月,日,小时,分钟,秒等信息

下面是一些例子:
SQL> select sysdate,add_months(sysdate,+1) next_month,add_months(sysdate,-1) pro_month from dual

SYSDATE          NEXT_MONTH       PRO_MONTH
-------------------- -------------------- --------------------
25-Nov-2008 22:29:35 25-Dec-2008 22:29:35 25-Oct-2008 22:29:35

SQL>  select sysdate,
  2  extract(year from sysdate) year,
  3  extract(month from sysdate) month,
  4  extract(day from sysdate) day
  5* from dual

SYSDATE            YEAR      MONTH      DAY
-------------------- ---------- ---------- ----------
25-Nov-2008 22:32:01       2008     11       25


SQL> select last_day(sysdate) last_day from dual;

LAST_DAY
---------
30-NOV-08


SQL> select last_day(add_months(sysdate,1)) next_last_day from dual

NEXT_LAST_DAY
--------------------
31-Dec-2008 22:46:25


SQL> select sysdate,round(sysdate,'HH24') from dual;

SYSDATE          ROUND(SYSDATE,'HH24'
-------------------- --------------------
25-Nov-2008 22:47:23 25-Nov-2008 23:00:00

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248613-1-1.html 上篇帖子: Oracle触发器语法及实例 下篇帖子: Oracle 外连接和 (+)号的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表