首页 > 技术文章 > 【数据库】Oracle中的日期型及处理方法

iamliuxin 2016-04-04 20:11 原文

oracle中提供了日期型来处理与日期相关的应用。其中,最常用的类型为date和timestamp。

本接下来,将讲述日期类型的基本信息及处理方法,主要内容包括:

日期型简介

日期型函数。

1. oracle中的日期型

oracle中的date类型实际包含了以下信息。

century:世纪信息

year:年份信息

month:月份信息

day:天数信息

hour:小时信息

minute:分钟信息

second:秒数信息。

除此之外,oracle还提供了timestamp(时间戳)类型,该类型用于表征更加精确的时间,精确度可以达到毫秒级。


2. oracle中的日期处理

2.1 获得当前日期----sysdate()函数

该函数用法返回当前日期,如下所示:

SQL>select sysdate from dual;

该执行结果,可以显示当前日期的年、月、日、时、分、秒等信息。


2.2 为日期加上特定月份----add_months()函数

对于一个日期型来说,一个常见应用为添加固定月数。

例如:

劳动法规定,员工自递交辞职报告一个月之后将自动离职,那么可以利用add_months()函数自动计算员工的离职日期。

SQL>select add_months(sysdate, 1) new_date from dual;

将该数据插入到数据库中,即可在系统中实现员工离职的预警信息。

但是,在一年之中,各个月的天数并不相同,因此在添加特定月份时,需要注意oracle的特殊处理方式。

SQL>select add_months(to_date('2010-2-27','yyyy--mm--dd'), 1 ) new_date from dual;

------

2010-3-27

2010年为平年,其二月份有28天。当我们利用2010-2-27日添加一个月时,2010年3月27日是一个有效日期,因此返回值为2010-3-27。但是,2010年2月28日是2月份的最后一天,为该日期添加一个月之后,返回值为3月份的最后一天,如下所示。

SQL>select add_months(to_date('2010-2-28','yyyy-mm-dd'), 1) new_date from dual;

----------------

2010-3-31

同样的,当直接增加月份之后的日期为非法日期时,oracle将返回该月的最后一天。

SQL>select add_months(to_date('2010-1-29','yyyy-mm-dd'), 1 ) new_date from dual;

-------------------------

2010-2-28

SQL>select add_months(to_date('2010-1-30','yyyy-mm-dd'), 1 ) new_date from dual;

-------------------------

2010-2-28

SQL>select add_months(to_date('2010-1-30','yyyy-mm-dd'), 1 ) new_date from dual;

------------------------

2010-2-28

上面可以看出,2010-1-29、2010-1-30、2010-1-31添加一个月之后,都将返回2010-2-28.


2.3 返回特定日期所在月的最后一天----last_day()函数

last_day()函数可以用于返回某个日期所在月份的最后一天,返回值同样为一个日期型。

SQL>select last_day(to_date('2010-2-28','yyyy-mm-dd')) new_date from dual;

------------------------

2010-2-28

SQL>select last_day(to_date('2000-2-28','yyyy-mm-dd')) new_date from dual;

------------------

2000-2-29

last_day(to_date('2010-2-28','yyyy-mm-dd'))用于返回2010年2月28日,所在月份---2月份的最后一天,返回值为2010-2-28.通过该返回值可知,2010年为平年;而last_day(to_date('2000-2-28','yyyy-mm-dd'))的返回值为2000-2-29,表明2010年为闰年。


2.4 返回两个日期所差的月数------months_between()函数

months_between()函数用于返回两个日期相减获得的月数,该函数的返回值并不一定为整数,如下所示:

SQL>select months_between(to_date('2010-4-4','yyyy-mm-dd')), to_date('2010-2-6','yyyy-mm--dd') as new_date from dual;

---------------

1.93548387096774

分析查询结果可知,2010-4-4与2010-2-6之间相差的月份数为一个小数,除此之外,如果第一个参数所代表的日期小于第二个参数,那么monts_between()函数将返回一个负数,如下所示。

SQL>select months_between(to_date('2010-4-4','yyyy-mm-dd')), to_date('2010-2-6','yyyy-mm--dd') as new_date from dual;

---------------

-1.9354838

对于非整数月份,oracle的计算规则为非整数天数除以31.例如:2010-2-6至2010-3-6为一个月,而2010-3-6至2010-4-4之间的天数为29天。所以Months_between()函数的返回值为1+29/31=1.93548387096774


2.5 返回特定日期之后的一周内的日期----next_day()函数

next_day()函数用于获得特定日期之后的一个星期之内的日期,例如:2010-4-4是星期日,那么为了获得紧随其后的第一个星期一,可以利用如下语句:

SQL>select next_day(to_date('2010-4-4','yyyy-mm-dd'), 2 ) new_date from dual;

----------------------

2010-4-5

next_day(to_date('2010-4-4','yyyy-mm-dd'), 2 )中的第一个参数to_date('2010-4-4','yyyy-mm-dd')指定起始日期;2代表星期一;该函数返回2010-4-4之后的第一个星期一,即2010-4-5.

在oracle中,1代表星期日,2代表星期一,3代表星期二,以此类推。因此,2010-4-4之后的第一个星期日,应该使用如下SQL语句获取。

SQL>select next_day(to_date('2010-4-4','yyyy-mm-dd'), 1 ) new_date from dual;

-----------------

2010-4-11


2.6 截取日期----trunc()函数

trunc()函数不仅可以截取数字,而且可以截取日期,其工作原理与截取数字非常相似。其使用语法如下所示。

trunc(日期,截取格式)

为了使用该函数,不仅需要指定日期原始值,而且要指定截取格式----即截取到日期的哪个部分。

SQL>select trunc(sysdate,'DD') new_date from dual;

-----------------

2010-4-5

trunc(sysdate,'DD') 用于将当前日期截取到天,获得结果2010-4-5.

SQL>select trunc(sysdate,'MM') new_date from dual;

------------------

2010-4-1

trunc(sysdate,'MM') 用于将当前日期截取到月,获得的结果为2010-4-1,即为当前月份的第一天。

SQL>select trunc(sysdate,'MI') new_date from dual;

--------------------

2010-4-5 15:44:00

trunc(sysdate,'MI') 用于将当前日期截取到分钟。


2.7 返回当前会话时区的当前日期-----currrent_date()函数

current_date()函数用于返回当前时区下的当前日期,我们可以结合当前日趋来查看current_date()函数的使用。

SQL>select sessiontimezone, to_char(current_date, 'yyyy-mm-dd hh:mi:ss') result from dual;

SESSIONTIMEZONE         RESULT

------------------------------           -------------------------------

+08:00                                2010-04-05 05:46:26

sessiontimezone用于返回当前时区,+08:00表明当前时区为东八区;to_char(current_date,'yyyy-mm-dd hh:mi:ss')返回当前日期。


2.8 返回当前会话时区的时间戳----current_timestamp()函数

current_timestamp()函数用于返回当前时区下的当前时间戳,可以结合当前时区查看current_timestamp()函数的使用。

SQL>select seesiontimezone, current_timestamp from dual;

SESSIONTIMEZONE        CURRENT_TIMESTAMP

-------------------------             -------------------------------------------------

+8:00                             05--4月  -10   04.51.11.640000  下午 +8:00


2.9 返回日期的某个域-------extract()函数

日期中的年、月、日、时、分、秒等可以看做日期的域,extract()函数可以从一个日期中分解出各个域,其使用语法如下所示。

extract(域名,from 日期)

为了从当前日期中分解出月份,可以利用如下所示的SQL语句。

SQL>select extract(month from sysdate ) new_month from dual;

--------------------------

4

extract(month from sysdate ) 中的month为月份的域代码,该函数从当前日期中分解出月份。

但是,需要注意的是,在日期型中无法分解出小时、分钟、秒等信息。

SQL>select extrace(hour from sysdate ) new_date from dual;

select extract(hour from sysdate ) new_date from dual;

ORA-30076: invalid extract field for extract source

上面报错表明数据源中并不含有Hour域,要想获得小时信息,则必须使用日期时间型作为数据源。

SQL>select extract(hour from systimestamp) new_hour from dual;

extract(hour from systimestamp) 从当前时间戳中后的小时信息,但需要注意的是,此时的小时信息为零时区的标准时间。


2.10 将日期转换为字符串------to_char()函数

to_char()函数不仅可以用于数值的格式化,同样可以对日期进行格式化。to_char()函数格式化日期的使用方法如下所示:

to_char(日期,格式)

例如:为了以yyyy-mm-dd的格式显示当前日期,那么可以利用如下SQL语句。

SQL>select to_char(sysdate, 'YYYY-MM-DD') new_date from dual;

---------------

2010-04-05

to_char(sysdate,'yyyy-mm-dd') 用于获得当前日期的yyyy-mm-dd的格式,返回值为2010-04-05


推荐阅读