Oracle日期格式化以及extract函数的使用

由于业务需要,这两天在学习Oracle,发现Oracle里面的日期它会给你转成一种很不习惯的格式,于是想着怎么样把它弄成年、月、日的格式来显示,查资料、看文档,最终找到解决办法了,其实是用到了to_char方法。

例如,在Oracle里面,一个表格里日期如2017-05-06,列名为time,查询后发现返回的是06-5月-17这种格式的,看着贼不爽,要想把它转成年月日这种格式的,可以这样做,

to_char(time, 'YYYY-MM-DD') as time  // 括号里的time表示表中的列名,第二个`time`则表示转换后的日期列名仍然为`time`

现在转换后的日期就是这样的,2017-05-06

那么extract函数是干什么的呢?extract英语意思是提取、选取,顾名思义,它表示从一个date类型中截取某一特定的部分,例如,选取年或月或日。

例如有这样一个表格:
这里写图片描述

现在我要从表格myTable中选取time中年份为2018年的所有数据,可以这样做,

select title,play,time from myTable where extract(year from time) = 2018;

或者:

select title,play,to_char(time, 'YYYY-MM-DD') as time from myTable where extract(year from time) = 2018

结果显然是都返回了(这里只是做个演示)

现在我要从表格myTable中选取time中月份为5的所有数据,操作为:

select title,play,time from myTable extract(month from time) = 5;

或者:

select title,play,to_char(time, 'YYYY-MM-DD') as time from myTable where extract(month from time) = 5

从表格myTable中选取time中日期为6的所有数据,操作为:

select title,play,time from myTable extract(day from time) = 6;

或者:

slect title,play,to_char(time, 'YYYY-MM-DD') as time from myTable where extract(day from time) = 6;

语法如下:extract(year|month|day|hour|minute|second from column_name) = value


Oracle extract函数用法

//oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分   
//语法如下:   
EXTRACT (   
        { YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }   
        | { TIMEZONE_HOUR | TIMEZONE_MINUTE }   
        | { TIMEZONE_REGION | TIMEZONE_ABBR }   
FROM { date_value | interval_value } )   
//我们只可以从一个date类型中截取 year,month,day(date日期的格式为yyyy-mm-dd);   
//我们只可以从一个 timestamp with time zone 的数据类型中截取TIMEZONE_HOUR和TIMEZONE_MINUTE;   
select extract(year from date'2011-05-17') year from dual;   
      YEAR   
----------   
      2011   
select extract(month from date'2011-05-17') month from dual;   
     MONTH   
----------   
         5   
select extract(day from date'2011-05-17') day from dual;   
       DAY   
----------   
        17   
//获取两个日期之间的具体时间间隔,extract函数是最好的选择   
select extract(day from dt2-dt1) day   
      ,extract(hour from dt2-dt1) hour   
      ,extract(minute from dt2-dt1) minute   
      ,extract(second from dt2-dt1) second   
from (   
     select to_timestamp('2011-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1   
           ,to_timestamp('2011-05-17 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2   
     from dual)   
/   
       DAY       HOUR     MINUTE     SECOND   
---------- ---------- ---------- ----------   
       102          4          1         46   
select extract(year from systimestamp) year   
      ,extract(month from systimestamp) month   
      ,extract(day from systimestamp) day   
      ,extract(minute from systimestamp) minute   
      ,extract(second from systimestamp) second   
      ,extract(timezone_hour from systimestamp) th   
      ,extract(timezone_minute from systimestamp) tm   
      ,extract(timezone_region from systimestamp) tr   
      ,extract(timezone_abbr from systimestamp) ta   
from dual   
/   
     YEAR      MONTH        DAY     MINUTE     SECOND         TH         TM  TR          TA   
---------- ---------- ---------- ---------- ---------- ---------- ---------- --------- ----------   
      2011          5         17          7     14.843         8         0   UNKNOWN     UNK   

oracleextract()函数—-用于截取年、月、日、时、分、秒

oracleextract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分

语法如下:

extract (    

        { year | month | day | hour | minute | second }    

        | { timezone_hour | timezone_minute }    

        | { timezone_region | timezone_abbr }    

from { date_value | interval_value } )

只可以从一个date类型中截取年月日

SQL> select  extract (year from sysdate) year, extract (month from sysdate) month, extract (day from sysdate) day from  dual;

      YEAR      MONTH        DAY
---------- ---------- ----------
      2015          5          4

只可以从一个date类型中截取年月日

SQL> select extract (year from date '2015-05-04') year, extract (month from date'2015-05-04') month, extract (day from date '2011-05-04') day from dual;

      YEAR      MONTH        DAY
---------- ---------- ----------
      2015          5          4

timestamp中获取年月日时分秒

select 
 extract(year from systimestamp) year
,extract(month from systimestamp) month
,extract(day from systimestamp) day
,extract(minute from systimestamp) minute
,extract(second from systimestamp) second
,extract(timezone_hour from systimestamp) th
,extract(timezone_minute from systimestamp) tm
,extract(timezone_region from systimestamp) tr
,extract(timezone_abbr from systimestamp) ta
from dual

image

获取两个日期之间的具体时间间隔

获取两个日期之间的具体时间间隔,extract函数是最好的选择

select
extract (day from dt2 - dt1) day,
extract (hour from dt2 - dt1) hour,
extract (minute from dt2 - dt1) minute,
extract (second from dt2 - dt1) second
from
(
select
to_timestamp ('2011-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1,
to_timestamp ('2011-05-17 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2
from
dual
)

image

获取interval类型特定部分

select extract(year from interval '21' year) year from dual

Interval 语法

interval '{ integer | integer time_expr | time_expr }' 

{ { day | hour | minute } [ ( leading_precision ) ] 

| second [ ( leading_precision [, fractional_seconds_precision ] ) ] } 

[ to { day | hour | minute | second [ (fractional_seconds_precision) ] } ]

leading_precision值的范围是0到9, 默认是2. time_expr的格式为:hh[:mi[:ss[.n]]] or mi[:ss[.n]] or ss[.n], n表示微秒.

范围值:

hour: 0 to 23

minute: 0 to 59

second: 0 to 59.999999999

eg:

interval '4 5:12:10.222' day to second(3)               表示: 45小时1210.222秒

interval '4 5:12' day to minute                         表示: 45小时12分

interval '400 5' day(3) to hour                         表示: 4005小时, 4003为精度,所以"day(3)", 注意默认值为2.

interval '400' day(3)                                   表示: 400天

interval '11:12:10.2222222' hour to second(7)           表示: 11小时1210.2222222秒

interval '11:20' hour to minute                         表示: 11小时20分

interval '10' hour                                      表示: 10小时

interval '10:22' minute to second                       表示: 1022秒

interval '10' minute                                    表示: 10分

interval '4' day                                        表示: 4天

interval '25' hour                                      表示: 25小时

interval '40' minute                                    表示: 40分

interval '120' hour(3)                                  表示: 120小时

interval '30.12345' second(2,4)                         表示: 30.1235秒, 因为该地方秒的后面精度设置为4, 要进行四舍五入.

interval '20' day - interval '240' hour = interval '10-0' day to second 表示: 20天 - 240小时 = 100
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值