oracle实验14:单行函数-日期函数

实验14:操作日期的函数

常用的日期函数:

  • SYSDATE:返回系统日期
  • MONTHS_BETWEEN:返回两个日期间隔的月数
  • ADD_MONTHS:在指定日期基础上加上相应的月数
  • NEXT_DAY:返回某一日期的下一个指定日期
  • LAST_DAY:返回指定日期当月最后一天的日期
  • ROUND(date[,'fmt'])对日期进行指定格式的四舍五入操作。按照YEAR、MONTH、DAY等进行四舍五入。
  • TRUNC(date[,'fmt'])对日期进行指定格式的截断操作。按照YEAR、MONTH、DAY等进行截断。
  • EXTRACT:返回从日期类型中取出指定年、月、日

 

系统日期的操作

SYSDATE查当前数据库的时间

SQL> select sysdate from dual;

SYSDATE                             
--------------                            
25-6月 -13  

 

查看当前日期的显示格式

SQL> col value for a20
SQL> select * from nls_session_parameters where parameter='NLS_DATE_FORMAT';

PARAMETER                      VALUE
------------------------------ --------------------
NLS_DATE_FORMAT                DD-MON-RR

 

修改日期的显示格式

SQL> alter session set NLS_DATE_FORMAT='YYYY/MM/DD:HH24:MI:SS';

会话已更改。

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2013/06/25:16:25:03

查看系统时间,数据库本身没有时间,他有scn号,和我们的时间不同。

 

设定为默认格式

SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-RR';

会话已更改。

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
--------------
25-6月 -13

再次查看,发现日期随着客户端的格式变化而变化。

 

日期的操作函数

两个日期的日间隔

SQL> select round(sysdate-hiredate) days,sysdate,hiredate from emp;

      DAYS SYSDATE        HIREDATE
---------- -------------- --------------
     11879 25-6月 -13     17-12月-80
     11814 25-6月 -13     20-2月 -81
     11812 25-6月 -13     22-2月 -81
     11773 25-6月 -13     02-4月 -81
     11594 25-6月 -13     28-9月 -81
     11744 25-6月 -13     01-5月 -81
     11705 25-6月 -13     09-6月 -81
     11544 25-6月 -13     17-11月-81
     11614 25-6月 -13     08-9月 -81
     11528 25-6月 -13     03-12月-81
     11528 25-6月 -13     03-12月-81
     11477 25-6月 -13     23-1月 -82

已选择12行。

两个日期时间相减的结果为天,往往带小数点,可以通过函数取整。

 

两个日期的月间隔

SQL> select months_between(sysdate,hiredate),SYSDATE,hiredate from emp;

MONTHS_BETWEEN(SYSDATE,HIREDATE) SYSDATE        HIREDATE
-------------------------------- -------------- --------------
                      390.280195 25-6月 -13     17-12月-80
                      388.183421 25-6月 -13     20-2月 -81
                      388.118905 25-6月 -13     22-2月 -81
                      386.764066 25-6月 -13     02-4月 -81
                      380.925357 25-6月 -13     28-9月 -81
                      385.796324 25-6月 -13     01-5月 -81
                       384.53826 25-6月 -13     09-6月 -81
                      379.280195 25-6月 -13     17-11月-81
                      381.570518 25-6月 -13     08-9月 -81
                      378.731808 25-6月 -13     03-12月-81
                      378.731808 25-6月 -13     03-12月-81
                      377.086647 25-6月 -13     23-1月 -82

已选择12行。

 

显示6个月后是哪一天

SQL> select add_months(hiredate,6),hiredate from emp --6个月后;

ADD_MONTHS(HIR HIREDATE
-------------- --------------
17-6月 -81     17-12月-80
20-8月 -81     20-2月 -81
22-8月 -81     22-2月 -81
02-10月-81     02-4月 -81
28-3月 -82     28-9月 -81
01-11月-81     01-5月 -81
09-12月-81     09-6月 -81
17-5月 -82     17-11月-81
08-3月 -82     08-9月 -81
03-6月 -82     03-12月-81
03-6月 -82     03-12月-81
23-7月 -82     23-1月 -82

已选择12行。

 

此日期算起,下一个星期二是哪一天。

SQL> select next_day(hiredate,'星期二'),hiredate from emp --当前日期的下一个星期二;

NEXT_DAY(HIRED HIREDATE
-------------- --------------
23-12月-80     17-12月-80
24-2月 -81     20-2月 -81
24-2月 -81     22-2月 -81
07-4月 -81     02-4月 -81
29-9月 -81     28-9月 -81
05-5月 -81     01-5月 -81
16-6月 -81     09-6月 -81
24-11月-81     17-11月-81
15-9月 -81     08-9月 -81
08-12月-81     03-12月-81
08-12月-81     03-12月-81
26-1月 -82     23-1月 -82

已选择12行。

注:日期和当前客户端的字符集有关,如果是英文的客户端就用“Tuesday ” ,如果是中文的客户端就用“星期二”。日期是格式和字符集敏感的。

 

此日期所在月的最后一天

SQL> select last_day(hiredate),hiredate from emp --当前日期的月底;

LAST_DAY(HIRED HIREDATE
-------------- --------------
31-12月-80     17-12月-80
28-2月 -81     20-2月 -81
28-2月 -81     22-2月 -81
30-4月 -81     02-4月 -81
30-9月 -81     28-9月 -81
31-5月 -81     01-5月 -81
30-6月 -81     09-6月 -81
30-11月-81     17-11月-81
30-9月 -81     08-9月 -81
31-12月-81     03-12月-81
31-12月-81     03-12月-81
31-1月 -82     23-1月 -82

已选择12行。

 

日期的进位和截取

SQL> select hiredate,round(hiredate,'mm') ,round(hiredate,'month') from emp;

HIREDATE       ROUND(HIREDATE ROUND(HIREDATE
-------------- -------------- --------------
17-12月-80     01-1月 -81     01-1月 -81
20-2月 -81     01-3月 -81     01-3月 -81
22-2月 -81     01-3月 -81     01-3月 -81
02-4月 -81     01-4月 -81     01-4月 -81
28-9月 -81     01-10月-81     01-10月-81
01-5月 -81     01-5月 -81     01-5月 -81
09-6月 -81     01-6月 -81     01-6月 -81
17-11月-81     01-12月-81     01-12月-81
08-9月 -81     01-9月 -81     01-9月 -81
03-12月-81     01-12月-81     01-12月-81
03-12月-81     01-12月-81     01-12月-81
23-1月 -82     01-2月 -82     01-2月 -82

已选择12行。

SQL> select hiredate,round(hiredate,'yyyy') ,round(hiredate,'year') from emp;

HIREDATE       ROUND(HIREDATE ROUND(HIREDATE
-------------- -------------- --------------
17-12月-80     01-1月 -81     01-1月 -81
20-2月 -81     01-1月 -81     01-1月 -81
22-2月 -81     01-1月 -81     01-1月 -81
02-4月 -81     01-1月 -81     01-1月 -81
28-9月 -81     01-1月 -82     01-1月 -82
01-5月 -81     01-1月 -81     01-1月 -81
09-6月 -81     01-1月 -81     01-1月 -81
17-11月-81     01-1月 -82     01-1月 -82
08-9月 -81     01-1月 -82     01-1月 -82
03-12月-81     01-1月 -82     01-1月 -82
03-12月-81     01-1月 -82     01-1月 -82
23-1月 -82     01-1月 -82     01-1月 -82

已选择12行。

SQL> select hiredate,trunc(hiredate,'mm') ,trunc(hiredate,'month') from emp;

HIREDATE       TRUNC(HIREDATE TRUNC(HIREDATE
-------------- -------------- --------------
17-12月-80     01-12月-80     01-12月-80
20-2月 -81     01-2月 -81     01-2月 -81
22-2月 -81     01-2月 -81     01-2月 -81
02-4月 -81     01-4月 -81     01-4月 -81
28-9月 -81     01-9月 -81     01-9月 -81
01-5月 -81     01-5月 -81     01-5月 -81
09-6月 -81     01-6月 -81     01-6月 -81
17-11月-81     01-11月-81     01-11月-81
08-9月 -81     01-9月 -81     01-9月 -81
03-12月-81     01-12月-81     01-12月-81
03-12月-81     01-12月-81     01-12月-81
23-1月 -82     01-1月 -82     01-1月 -82

已选择12行。

SQL> select hiredate,trunc(hiredate,'yyyy') ,trunc(hiredate,'year') from emp;

HIREDATE       TRUNC(HIREDATE TRUNC(HIREDATE
-------------- -------------- --------------
17-12月-80     01-1月 -80     01-1月 -80
20-2月 -81     01-1月 -81     01-1月 -81
22-2月 -81     01-1月 -81     01-1月 -81
02-4月 -81     01-1月 -81     01-1月 -81
28-9月 -81     01-1月 -81     01-1月 -81
01-5月 -81     01-1月 -81     01-1月 -81
09-6月 -81     01-1月 -81     01-1月 -81
17-11月-81     01-1月 -81     01-1月 -81
08-9月 -81     01-1月 -81     01-1月 -81
03-12月-81     01-1月 -81     01-1月 -81
03-12月-81     01-1月 -81     01-1月 -81
23-1月 -82     01-1月 -82     01-1月 -82

已选择12行。

日期的截取与年,月,日,时,分,秒为中心。

 

extract函数

语法:EXTRACT ([YEAR] [MONTH][DAY] FROM[日期类型表达式])

SQL> select empno,ename,hiredate,extract(month from hiredate) month

        from emp  where deptno=10;

     EMPNO ENAME      HIREDATE            MONTH                                
---------- ---------- -------------- ----------                                
      7782 CLARK      09-6月 -81              6                                
      7839 KING       17-11月-81             11                                
      7934 MILLER     23-1月 -82              1


数据类型的隐式转换

字符串可以转化为数字和日期。

数字要合法,日期要格式匹配。

SQL> select ename,empno from emp where empno='7900';

ENAME           EMPNO
---------- ----------
JAMES            7900


数字和日期在赋值的时候可以转换为字符串,但在表达式的时候不可以。

SQL> select ename,empno from emp where ename='123';

未选定行

SQL> select ename,empno from emp where ename=123;
select ename,empno from emp where ename=123
                                  *
第 1 行出现错误:
ORA-01722: 无效数字

 

数据类型的显式转换

通常是在字符类型,日期类型,数字类型之间进行显性转换。

主要有3个显性函数:

–TO_CHAR
–TO_NUMBER
–TO_DATE


TO_CHAR(date|number[,‘fmt’]) 把日期类型/数字类型的表达式或列转换为变长类型字符类型。

  • ‘fmt’指的是需要显示的格式
  • 需要写在单引号中,并且是大小写敏感
  • 可包含任何有效的日期格式
  • fm表示去除生成结果的前导零或空格

 

日期转化为字符串

SQL> select ename,to_char(hiredate,'yyyy/mm/dd') from emp;

ENAME      TO_CHAR(HI
---------- ----------
SMITH      1980/12/17
ALLEN      1981/02/20
WARD       1981/02/22
JONES      1981/04/02
MARTIN     1981/09/28
BLAKE      1981/05/01
CLARK      1981/06/09
KING       1981/11/17
TURNER     1981/09/08
JAMES      1981/12/03
FORD       1981/12/03
MILLER     1982/01/23

已选择12行。

 

fm去掉前面的0或空格

SQL> select ename,to_char(hiredate,'fmyyyy/mm/dd') from emp;

ENAME      TO_CHAR(HI
---------- ----------
SMITH      1980/12/17
ALLEN      1981/2/20
WARD       1981/2/22
JONES      1981/4/2
MARTIN     1981/9/28
BLAKE      1981/5/1
CLARK      1981/6/9
KING       1981/11/17
TURNER     1981/9/8
JAMES      1981/12/3
FORD       1981/12/3
MILLER     1982/1/23

已选择12行。

 

格式内加入字符串用双引

SQL> select to_char(hiredate,'fmyyyy "年" mm "月"') from emp;

TO_CHAR(HIRED
-------------
1980 年 12 月
1981 年 2 月
1981 年 2 月
1981 年 4 月
1981 年 9 月
1981 年 5 月
1981 年 6 月
1981 年 11 月
1981 年 9 月
1981 年 12 月
1981 年 12 月

1982 年 1 月

已选择12行。

 

当前距离零点的秒数

SQL> select sysdate,to_char(sysdate,'sssss') ss from dual;

SYSDATE        SS
-------------- -----
25-6月 -13     60442

 

常用日期格式:

    • YYYY:4位数字表示年份;
    • YY:2位数字表示年份,但是无世纪转换(与RR区别在后面章节介绍);
    • RR:2位数字表示年份,有世纪转换(与YY区别在后面章节介绍);
    • YEAR:年份的英文拼写;
    • MM:两位数字表示月份;
    • MONTH:月份英文拼写;
    • DY:星期的英文前三位字母;
    • DAY:星期的英文拼写;
    • D:数字表示一星期的第几天,星期天是一周的第一天。
    • DD:数字表示一个月中的第几天;
    • DDD:数字表示一年中的第几天。

常用时间格式

    • AM 或PM:上下午表示;
    • HH 或HH12或HH24:数字表示小时。HH12代表12小时计时,HH24代表24小时计时;
    • MI:数字表示分钟;
    • SS:数字表示秒。

一些特殊格式

    • TH:显示数字表示的英文序数词,如:DDTH显示天数的序数词。
    • SP:显示数字表示的拼写。
    • SPTH:显示数字表示的序数词的拼写。

 

数据类型的显式转换

数字转换为字符串

具体格式如下:

–9:一位数字;
–0:一位数字或前导零;
–$:显示为美元符号;
–L:显示按照区域设置的本地货币符号;
–.:小数点;
–,:千位分割符;


SQL> select ename,to_char(sal,'9999.000') salary from emp;

ENAME      SALARY
---------- ---------
SMITH        801.000
ALLEN       1601.000
WARD        1250.000
JONES       2975.000
MARTIN      1250.000
BLAKE       2850.000
CLARK       2450.000
KING        5000.000
TURNER      1501.000
JAMES        950.000
FORD        3002.000
MILLER      1300.000

已选择12行。

SQL> select ename,to_char(sal,'$00099999000.00') salary from emp;

ENAME      SALARY
---------- ----------------
SMITH       $00000000801.00
ALLEN       $00000001601.00
WARD        $00000001250.00
JONES       $00000002975.00
MARTIN      $00000001250.00
BLAKE       $00000002850.00
CLARK       $00000002450.00
KING        $00000005000.00
TURNER      $00000001501.00
JAMES       $00000000950.00
FORD        $00000003002.00
MILLER      $00000001300.00

已选择12行。

 

SQL> select ename,to_char(sal,'9G999D99') salary from emp;

ENAME      SALARY
---------- ---------
SMITH         801.00
ALLEN       1,601.00
WARD        1,250.00
JONES       2,975.00
MARTIN      1,250.00
BLAKE       2,850.00
CLARK       2,450.00
KING        5,000.00
TURNER      1,501.00
JAMES         950.00
FORD        3,002.00
MILLER      1,300.00

已选择12行。

G是千分符,D是小数点。

 

在数据库中十六进制的表达是按照字符串来描述的,十进制的数转换为十六进制的数使用to_char函数。

SQL> select to_char(321,'xxxxx') from dual;

TO_CHAR(321,'xxxxx')
------------------------
   141

其中xxxxx的位数要足够,不然会报错,多写几个足够大即可。

 

TO_NUMBER和TO_DATE函数

TO_NUMBER(char[,'fmt']) 把字符类型列或表达式转换为数字类型。

–使用格式和TO_CHAR中转换成字符类型中的格式相同。
–在转换时让Oracle知道字符串中每部分的功能。

TO_DATE(char[,'fmt']) 把字符类型列或表达式转换为日期类型。

–格式和TO_CHAR中转换成字符类型中的格式相同。

 

将十六进制的数转换为十进制用to_number

SQL> select to_number('abc32','xxxxxxxxxxxxxxx') from dual;

TO_NUMBER('ABC32','XXXXXXXXXXXXXXX')
------------------------------------
                              703538

 

to_date

SQL> select to_date('1月-15-13','month dd-yyyy') from dual;

TO_DATE('1月-                                                                 
--------------                                                                 
15-1月 -13  

注:日期的语言和格式是敏感的!                                                                   

SQL> select to_number('100.00','9G000D99') from dual;

TO_NUMBER('100.00','9G000D99')                                                 
------------------------------                                                 
                           100                                                 

 

rr和yy日期数据类型

yy是两位来表示年,世纪永远和说话者的当前世纪相同

RR比较灵活,分上半世纪和下半世纪。

  • 当前年份0-49,指定日期是0-49时,返回当前世纪。
  • 当前年份0-49,指定日期是50-99时,返回上个世纪。
  • 当前年份50-99,指定日期是0-49时,返回下个世纪。
  • 当前年份50-99,指定日期是50-99时,返回当前世纪。

SQL> select to_char(sysdate,'yyyy') "当前",
    to_char(to_date('98','yy'),'yyyy') "yy98",
    to_char(to_date('08','yy'),'yyyy') "yy08",
    to_char(to_date('98','rr'),'yyyy') "rr98",
    to_char(to_date('08','rr'),'yyyy') "rr08"
    from dual;

当前 yy98 yy08 rr98 rr08                                                       
---- ---- ---- ---- ----                                                       
2013 2098 2008 1998 2008       


 

返回目录  http://www.cnblogs.com/downpour/p/3155689.html

 

posted on 2013-06-25 20:45  不吃鱼的小胖猫  阅读(505)  评论(0编辑  收藏  举报