oracle的日期格式化的使用

oracle的日期格式化获取当前时间

oracle的日期格式定义

       Year:      
        yy two digits 两位年                显示值:07 
        yyy three digits 三位年                显示值:007 
        yyyy four digits 四位年                显示值:2007 
            
        Month:      
        mm    number     两位月              显示值:11 
        mon    abbreviated 字符集表示          显示值:11月,若是英文版,显示nov     
        month spelled out 字符集表示          显示值:11月,若是英文版,显示november 
          
        Day:      
        dd    number         当月第几天        显示值:02 
        ddd    number         当年第几天        显示值:02 
        dy    abbreviated 当周第几天简写    显示值:星期五,若是英文版,显示fri 
        day    spelled out   当周第几天全写    显示值:星期五,若是英文版,显示friday        
        ddspth spelled out, ordinal twelfth 
             
              Hour: 
              hh    two digits 12小时进制            显示值:01 
              hh24 two digits 24小时进制            显示值:13 
              
              Minute: 
              mi    two digits 60进制                显示值:45 
              
              Second: 
              ss    two digits 60进制                显示值:25 
              
              其它 
              Q     digit         季度                  显示值:4 
              WW    digit         当年第几周            显示值:44 
              W    digit          当月第几周            显示值:1 
              
        24小时格式下时间范围为: 0:00:00 - 23:59:59....      
        12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 

通常日期格式都是以时间戳的形式存放在数据库里,当前端页面通过接口查询时,我们会将一个对象的某些属性查出来返回给页面。

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss" )

原因是:页面将数据传到后台,是以字符串的形式。所以时间格式会出错。加上此注解,后台可解析时间格式的字符串。但是后台传到前台,前台没办法解析。需要做如下操作。

@JsonFormat注解

                    <tr style="height: 50px">
                        <th style="width: 70px">拆除日期:</th>
                        <td style="width: 230px" colspan="3">
                            <input name="removeTime" class="easyui-my97" data-options="required:true" style="width: 200px;" >
                        </td>
                    </tr>
                        <td style="width: 200px" colspan="3">
                            <input name="approveTime" class="easyui-textbox" style="width: 170px;" >
                        </td>
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date removeTime;//拆除日期
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date approveTime;//审批时间

oracle查找月的第一天,最后一天 

  SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month, 
       Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month, 
       Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month, 
       LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month 
   FROM dual; 

oracle计算一年前的日期

create or replace view v_rgq_one as
select "CODE","NAME","CUR_TIME","CUR_AMOUNT","VARIATION","LAST_TIME","LAST_AMOUNT" from (
select 
       cur_year.sj  as cur_time,
       cur_year.yql as cur_amount,
       cur_year.yql-last_year.yql as variation,
       last_year.sj    as last_time,
       last_year.yql  as last_amount
  from SMCOUNT cur_year left join sm_count last_year
  on cur_year.sj =
       to_char(add_months(to_date(last_year.sj, 'YYYY-MM-DD'), +12),
               'YYYY-MM-DD')
 order by cur_year.sj desc);

查看某张表一小时前的数据

select * from ct_user as of timestamp sysdate-(1/(24));

add_months(x,y)或者add_months(times,months)函数:计算多少个月以后的日期,如果后者为负数,则计算当前日期之前多少个月的日期。

select add_months(sysdate,-6) from dual;//查询的结果是当前时间半年前的时间
select add_months(sysdate,6) from dual;//查询的结果是当前时间半年后的时间
 select ename, hiredate from emp where hiredate <= add_months(sysdate, -288);//入职时间超过24年-288 = -24*12

last_day():返回指定日期所在月份的最后一天;

select last_day(sysdate) from dual;//查询当前月份的最后一天:
select last_day(to_date('1992-10-09','yyyy-mm-dd')) from dual;//查询某天所在月份的最后一天:

to_date()函数,将字符串转为日期

注意:SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟

另要以24小时的形式显示出来要用HH24

update t_date set d3=to_date('2016-12-20','YYYY-MM-DD') where id=1;

update t_date set d3=to_date('2016-12-20 18:31:34','YYYY-MM-DD HH24:MI:SS') where id=1;

两个日期间的天数      

    select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;   

补充;查找2002-02-28至2002-02-01间除星期一和七的天数  

  select count(*)      
   from ( select rownum-1 rnum      
       from all_objects      
       where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-      
       02-01','yyyy-mm-dd')+1      
      )      
   where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )      
        not in ( '1', '7' )      

months_between()函数返回两个日期之间的月份数。如果两个日期月份内天数相同,或者都是某个月的最后一天,返回一个整数,否则,返回数值带小数,以每天1/31月来计算月中剩余天数。如果日期1日期2小 ,返回值为负数。

months_between(to_date('1999.11.29','yyyy.mm.dd'), to_date('1998.11.29','yyyy.mm.dd')) 

返回  12

注:两个参数均为同样月份的29号,所以返回一整数。

 
 months_between(to_date('1999.11.29','yyyy.mm.dd'), to_date('1998.12.24','yyyy.mm.dd'))

 返回   13.16129

如果两个时间的日期不同,他就算出日期差都除以31,结果就一堆小数。

    select months_between(to_date('01-31-2008','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;      
    1      
   select months_between(to_date('02-01-2008','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;      
    1.03225806451613 

定义函数处理月份差

create or replace function fun_month_num (var_begin_date in varchar2,var_end_date in varchar2)  
return number  
as
    is_begin_date date;  
    is_end_date date;  
    is_count number(10);  
    i number(10);  
    j number(10);  
    is_this_date date;  
begin  
    is_begin_date := to_date(var_begin_date,'yyyy-mm-dd');  
    is_end_date := to_date(var_end_date,'yyyy-mm-dd');    
    is_this_date := last_day(is_end_date) ;    
    is_count := 0 ;  
   
    loop  
    exit when is_this_date < last_day(is_begin_date)+1 ;  
        is_count := is_count+1;                        
        is_this_date := last_day(is_this_date)-32;  

    end loop;  

    return is_count;  
end;

使用

select fun_month_num('2008-09-30','2008-02-01') from dual; 

next_day()

NEXT_DAY(date,char) date参数为日期型

 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日 
   1 2 3 4 5 6 7      
   日 一 二 三 四 五 六  

 next_day(sysdate,6)是从当前开始下一个星期五。
后面的数字是从星期日开始算起。    
select next_day(to_date('2014-4-1','yyyy-MM-dd'),'星期三') from dual;

从特定日期得到之后的第一个星期三的日期。

select next_day( sysdate, 'MONDAY') from dual;
可以求出当前日期的下个星期一。

next_day(to_date('1999.11.24','yyyy.mm.dd'),'friday')      
// 返回   1999年11月26日
//1999年11月24日是星期三,第二个参数是星期五,是两天后。

to_char()日期格式转换

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   //日期转化为字符串   
select to_char(sysdate,'yyyy') as nowYear   from dual;   //获取时间的年   
select to_char(sysdate,'mm')    as nowMonth from dual;   //获取时间的月   
select to_char(sysdate,'dd')    as nowDay    from dual;   //获取时间的日   
select to_char(sysdate,'hh24') as nowHour   from dual;   //获取时间的时   
select to_char(sysdate,'mi')    as nowMinute from dual;   //获取时间的分   
select to_char(sysdate,'ss')    as nowSecond from dual;   //获取时间的秒 

获取小时数对比

  select sysdate ,to_char(sysdate,'hh') from dual;   
  //2003-10-13 19:35:21 07 
  select sysdate ,to_char(sysdate,'hh24') from dual;  
  //2003-10-13 19:35:21 19 

trunc()函数处理日期

    语法格式:TRUNC(date[,fmt])

  其中:date 一个日期值;fmt 日期格式。

    该日期将按指定的日期格式截取;忽略它则由最近的日期截取。

 select trunc(sysdate) from dual;--2017/2/13,返回当前时间
   select trunc(sysdate,'yy') from dual;--2017/1/1,返回当年第一天
   select trunc(sysdate,'mm') from dual;--2017/2/1,返回当月的第一天
   select trunc(sysdate,'d') from dual;--2017/2/12,返回当前星期的第一天,即星期天
   select trunc(sysdate,'dd') from dual;--2017/2/13,返回当前日期,今天是2017/2/13
   select trunc(sysdate ,'HH24') from dual;--2017/2/13 15:00:00,返回本小时的开始时间
   select trunc(sysdate ,'MI') from dual;--2017/2/13 15:13:00,返回本分钟的开始时间

   trunc(sysdate,'year') YEAR,        //返回当前年的1月1日,无时分秒 
   trunc(sysdate,'month') MONTH ,     //返回当前月的1日,无时分秒 
   trunc(sysdate,'day') DAY           //返回当前星期的星期天,无时分秒 

对number类型则截取小数,截取时并不对数据进行四舍五入。
    select trunc(123.567,2) from dual;--123.56,将小数点右边指定位数后面的截去;
    select trunc(123.567,-2) from dual;--100,第二个参数可以为负数,表示将小数点左边指定位数后面的部分截去,即均以0记;
    select trunc(123.567) from dual;--123,默认截去小数点后面的部分;

extract()函数用于从date类型或interval类型中截取到特定的部分;

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

两个日期之间的具体时间间隔,可以用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('2013-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1,to_timestamp('2013-11-30 22:08:46', 'yyyy-mm-dd hh24:mi:ss') dt2 from dual
);

round[舍入到最接近的日期](day:舍入到最接近的星期日) 。与trunc不同的是,trunc()不进行四舍五入操作,只截取

   select sysdate S1, 
   round(sysdate) S2 , 
   round(sysdate,'year') YEAR, 
   round(sysdate,'month') MONTH , 
   round(sysdate,'day') DAY from dual

greatest返回日期列表中最晚日期

 select greatest('01-1月-04','04-1月-04','10-2月-04') from dual

oracle日期换算

oracle计算小时,分,秒,毫秒      

    select      
     Days,      
     A,      
     TRUNC(A*24) Hours,      
     TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,      
     TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,      
     TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds      
    from      
    (      
     select      
     trunc(sysdate) Days,      
     sysdate - trunc(sysdate) A      
     from dual      
   )    

oracle日期计算换算

  floor((date2-date1) /365) 作为年      
   floor((date2-date1, 365) /30) 作为月      
   d(mod(date2-date1, 365), 30)作为日.
当前时间减去7分钟的时间 
select sysdate,sysdate - interval ’7’ MINUTE from dual 
当前时间减去7小时的时间 
select sysdate - interval ’7’ hour from dual 
当前时间减去7天的时间 
select sysdate - interval ’7’ day from dual 
当前时间减去7月的时间 
select sysdate,sysdate - interval ’7’ month from dual 
当前时间减去7年的时间 
select sysdate,sysdate - interval ’7’ year from dual 
时间间隔乘以一个数字 
select sysdate,sysdate - 8 *interval ’2’ hour from dual

日期天换算为秒

select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from dual 

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/83304089
今日推荐