Oracle中TO_DATE TO_CHAR格式

摘要:
如果输入的日期数据的时间部分被忽略,Oracle会将小时、分钟和秒部分设置为0,即舍入到当天。类似地,如果忽略DD参数,Oracle将使用1作为当天的默认值,即四舍五入到月份。然而,不要被这种“惯性”所迷惑。如果忽略MM参数,Oracle将不舍入到年份和当前月份。注:1。使用Oracle的to_当日期函数用于日期转换时,它可以直观地使用“yyyy-MM-ddHH:MM:ss”格式进行转换,但在Oracle中,它会导致错误:“ORA01810格式代码出现两次”。

TO_CHAR 是把日期或数字转换为字符串

TO_DATE 是把字符串转换为数据库中得日期类型转换函数

TO_NUMBER 将字符转化为数字

TO_CHAR

使用TO_CHAR函数处理数字

TO_CHAR(number, '格式')

TO_CHAR(salary,’$99,999.99’);

使用TO_CHAR函数处理日期

TO_CHAR(date,’格式’);

TO_NUMBER

使用TO_NUMBER函数将字符转换为数字

TO_NUMBER(char[, '格式'])

TO_DATE

使用TO_DATE函数将字符转换为日期

TO_DATE(char[, '格式'])

数字格式格式

9 代表一个数字

0 强制显示0

$ 放置一个$符

L 放置一个浮动本地货币符

. 显示小数点

, 显示千位指示符

 日期格式

格式控制 描述

YYYY、YYY、YY 分别代表4位、3位、2位的数字年

YEAR 年的拼写

MM 数字月

MONTH 月的全拼

MON 月的缩写

DD 数字日

DAY 星期的全拼

DY 星期的缩写

AM 表示上午或者下午

HH24、HH12 12小时制或24小时制

MI 分钟

SS 秒钟

SP 数字的拼写

TH 数字的序数词

“特殊字符” 假如特殊字符

HH24:MI:SS AM 15:43:20 PM

日期例子:

SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL

SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') FROM DUAL

SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24') FROM DUAL

SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') FROM DUAL

SELECT TO_DATE('2006-05', 'YYYY-MM') FROM DUAL

SELECT TO_DATE('2006', 'YYYY') FROM DUAL

日期说明:

当省略HH、MI和SS对应的输入参数时,Oracle使用0作为DEFAULT值。

如果输入的日期数据忽略时间部分,Oracle会将时、分、秒部分都置为0,也就是说会取整到日。

同样,忽略了DD参数,Oracle会采用1作为日的默认值,也就是说会取整到月。

但是,不要被这种“惯性”所迷惑,如果忽略MM参数,Oracle并不会取整到年,取整到当前月。

注意:

1.在使用Oracle的to_date函数来做日期转换时,可能会直觉地采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。

如:

select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;

结果

Oracle中TO_DATE TO_CHAR格式第1张

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

select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;

结果

Oracle中TO_DATE TO_CHAR格式第2张

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

select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟

select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份


TO_DATE格式(以时间:2007-11-02 13:45:25为例)

        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 .... 

            
1. 日期和字符转换函数用法(to_date,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 to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual//

2.

select to_char( to_date(222,'J'),'Jsp') from dual  

    显示Two Hundred Twenty-Two

Oracle中TO_DATE TO_CHAR格式第3张

3.求某天是星期几

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;

   星期一

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

   monday

   设置日期语言

ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';

   也可以这样

TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')

4. 两个日期间的天数

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

5. 时间为null的用法

   select id, active_date from table1

   UNION

   select 1, TO_DATE(null) from dual;

   注意要用TO_DATE(null)


6.月份差

select  months_between(date'2014-04-23',date'2013-04-23') days from dual;

   那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。

   所以,当时间需要精确的时候,觉得to_char还是必要的

      
7. 日期格式冲突问题

    输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

    alter system set NLS_DATE_LANGUAGE = American

    alter session set NLS_DATE_LANGUAGE = American

    或者在to_date中写

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

    注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

    可查看

    select * from nls_session_parameters

    select * from V$NLS_PARAMETERS

8.

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' )

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

   在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒).


9. 查找月份

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

    1

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

    1.03225806451613

       
10. Next_day的用法

    Next_day(date, day)

    Monday-Sunday, for format code DAY

    Mon-Sun, for format code DY

    1-7, for format code D


11

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

   注意:第一条记录的TIME 与最后一行是一样的

   可以建立一个函数来处理这个问题

create or replace function sys_date return date is

   begin

   return sysdate;

   end;

调用

select to_char(sys_date,'hh:mi:ss') from all_objects;

     

12.获得小时数

     extract()找出日期或间隔值的字段值

    SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

    SQL> 

select sysdate ,to_char(sysdate,'hh') from dual;

    SYSDATE TO_CHAR(SYSDATE,'HH') 

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

    2003-10-13 19:35:21 07

    

    SQL> 

select sysdate ,to_char(sysdate,'hh24') from dual;

    
    SYSDATE TO_CHAR(SYSDATE,'HH24')

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

    2003-10-13 19:35:21 19

       
13.年月日的处理

select older_date, newer_date, years, months, abs( trunc( newer_date- add_months( older_date,years*12+months ) )) days

   from ( select

        trunc(months_between( newer_date, older_date )/12) YEARS,

        mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS,

        newer_date,

        older_date

        from (

              select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date

              from emp

             )

      )

--测试无用

14.处理月份天数不定的办法

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

16.找出今年的天数

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

   闰年的处理方法

   to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' )

   如果是28就不是闰年


17.yyyy与rrrr的区别

   'YYYY99 TO_C

   ------- ----

   yyyy 99 0099

   rrrr 99 1999

   yyyy 01 0001

   rrrr 01 2001


18.不同时区的处理

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate from dual;

19. 5秒钟一个间隔

select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') from dual

   2002-11-1 9:55:00 35786

   SSSSS表示5位秒数


20.一年的第几天

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

        
   310 2002-11-6 10:03:51


21.计算小时,分,秒,毫秒

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

   )


   select * from tabname

   order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

   
   //

   floor((date2-date1) /365) 作为年

   floor((date2-date1, 365) /30) 作为月

   d(mod(date2-date1, 365), 30)作为日.


23.next_day函数 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日

   next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

   1 2 3 4 5 6 7

   日 一 二 三 四 五 六

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

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

   日期 返回的是天 然后 转换为ss

     
24,round[舍入到最接近的日期](day:舍入到最接近的星期日)

   select sysdate S1,

   round(sysdate) S2 ,

   round(sysdate,'year') YEAR,

   round(sysdate,'month') MONTH ,

   round(sysdate,'day') DAY from dual

25.trunc[截断到最接近的日期,单位为天] ,返回的是日期类型

   select sysdate S1,

     trunc(sysdate) S2, --//返回当前日期,无时分秒

     trunc(sysdate,'year') YEAR, --//返回当前年的1月1日,无时分秒

     trunc(sysdate,'month') MONTH , --//返回当前月的1日,无时分秒

     trunc(sysdate,'day') DAY --//返回当前星期的星期天,无时分秒

   from dual

26,返回日期列表中最晚日期

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

27.计算时间差

     注:oracle时间差是以天数为单位,所以换算成年月,日

     

      select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual //时间差-select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual //时间差-select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual //时间差-select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual //时间差-select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual //时间差-select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual //时间差-

28.更新时间

     注:oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual //改变时间-select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-

29.查找月的第一天,最后一天

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;

参:https://www.douban.com/note/31849478/

免责声明:文章转载自《Oracle中TO_DATE TO_CHAR格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前台kendo ui js grid框架增删改查SOA、REST 和六边形架构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle 11g 新特性 SecureFiles 说明

一. Oracle SecureFiles 说明 1.1 现有LOB实施中的问题   在Oracle8i 中,LOB 设计是基于下列假设做出的: (1)  LOB 实例化的大小预计为几个兆字节。 (2)  LOB 通常被视为“单写多读”类型的数据。很少进行更新,所以可以为所有类型的更新(大型或小型)对整个块进行版本化。 (3)  预计很少有批处理会流式...

变量的类型转变

C#中类型转换(显隐)的机制分为两种:一、隐式转换(implicit conversions)二、显式转换(explict conversions)隐式转换不需要指明欲转变的类型; C#中数据类型转换的几种形式进行了详细的分析: 1、Convert.ToInt32(); //转换成32位的整数。2、变量.ToString();/最常见的转换成 字符串。3、...

Oracle表中一行记录被锁(行锁,表锁,死锁)

表现形式:可以向表里面save新数据,但是无法跟新某一条数据,update的时候就一直在等待。 Oracle锁表查询和解锁方法 数据库操作语句的分类DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert、delete、updateDCL:数据库控制语言 ,关键字:grant、removeDQL:数据库查询语言,关键字:s...

2.NULL 的问题

/*************************************************二、主题:NULL 的问题 *************************************************/    CREATE TABLE TEST1    (           ID   NUMBER(1) NOT NULL PRI...

整体二分

关于整体二分的学习其实只是了解了普通二分之后自然就懂了整体二分了。没有很难但是基于整体二分是基于时间和值域的分治。 比CDQ要更强一点。因为可以在一些离线的题目当中代替树套树什么的。 同时也非常的好写 。至少代码好懂。 首先是值域上的二分 这个二分是分离不同的值毕竟不同的值在不同的区间之内。我们可以将其二分。但是单次二分也是可以得到整体的信息的不妨把所有的...

memcpy的使用方法总结

1、memcpy 函数用于 把资源内存(src所指向的内存区域) 复制到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;函数原型:void *memcpy(void *dest, void *src, unsigned int count);使用方法:(1)能够拷贝不论什么类型的对象,由于函数的參数类型是void*(...