ITPub博客

首页 > 数据库 > Oracle > ORACLE从零开始系列之SQL(三)

ORACLE从零开始系列之SQL(三)

原创 Oracle 作者:seansql 时间:2014-03-12 18:23:08 0 删除 编辑

本小节知识点

日期函数的使用
to_char函数的使用

日期函数

MONTHS_BETWEEN 显示两个日期之间相差的月数
ADD_MONTHS 为当前时间加月份
NEXT_DAY 为获得下一个指定的周几
LAST_DAY 为计算本月的最后一天

需要注意的是外国人的周一是星期日,而咱们中国的周一是星期一

SQL> select sysdate from dual;

SYSDATE
---------
16-JAN-13  --数据库中当前时间为2013年-1月16日

SQL> select next_day(sysdate,1) as day  from dual;

DAY
---------
20-JAN-13  --下一个星期一为2013年1月20日

从上图中可以看到2013年1月16日是星期三,下一个星期一为21号

同时我们要注意在round和trunc中dd和day的区别
SQL> select round(sysdate,'dd') from dual;

ROUND(SYS
---------
17-JAN-13

SQL> select round(sysdate,'day') from dual;

ROUND(SYS
---------
20-JAN-13

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

TRUNC(SYS
---------
17-JAN-13

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

TRUNC(SYS
---------
13-JAN-13
在round和trunc中dd代表几号,DAY代表最近的周一(老外的星期日),请观察以上四条SQL语句以便于理解记忆。








ROUND(四舍五入)
    此函数可以对日期进行四舍五入

此函数四舍五入的原则为,若当前时间大于一半数就入,小于等于一半数就舍
例如:
SQL> select sysdate from dual;

SYSDATE
---------
16-JAN-13  --当前时间大于15日(每个月30天),大于了一半数

SQL> select round(sysdate,'MONTH') from dual;

ROUND(SYS
---------
01-FEB-13   -- 所以在round的时候就变成了2013年2月1日

SQL> select round(to_date('2013-01-14','yyyy-mm-dd'),'MONTH') from dual;

ROUND(TO_
---------
01-JAN-13  --当前时间为2013-01-14(小于半数),所以这里变成了2013年1月1日

TRUNC
TRUNC为截断函数,此函数和round的区别为此函数不对数据四舍五入,而是通通截断。


SQL> select trunc(sysdate,'MONTH') day from dual;

DAY
---------
01-JAN-13

SQL> select round(to_date('2013-01-14','yyyy-mm-dd'),'MONTH') day from dual;

DAY
---------
01-JAN-13

to_char函数的使用

上图为显式转换图,但是NUMBER和DATE不能直接转换,需要借用to_char中转后才能转换
我们先来看TO_CHAR

to_char可以将日期或数字格式转换成字符串格式,上图中的fm表示切除前导0
SQL>  select to_char(to_date( '2014-1-1','yyyy-mm-dd'), 'DD Month YYYY') from dual;

TO_CHAR(TO_DATE('
-----------------
01 January   2014

SQL> select to_char(to_date( '2014-1-1','yyyy-mm-dd'), 'fmDD Month YYYY') from dual;

TO_CHAR(TO_DAT
--------------
1 January 2014

to_char还能够格式化钱币金额的输出



转化成人民币格式输出:
select TO_CHAR(1800,'L99,999.00','NLS_CURRENCY=¥') from dual; --NLS_CURRENCY定义了本地金钱的符号

TO_CHAR(17145.77,'L99,999.00','NLS_CURRE
----------------------------------------
        ¥1800

to_char还能够进行10进制到16进制的转换
SQL> select to_char(10,'x') from dual;

TO
--
 a
转换时会舍弃小数位
SQL> select to_char(10.234,'x') from dual;

TO
--
 a


在TO_CHAR中YYYY和YEAR的返回结果是不一样的



SQL> select sysdate from dual;

SYSDATE
---------
17-JAN-13


SQL> SELECT to_char(SYSDATE ,'YEAR') FROM DUAL;

TO_CHAR(SYSDATE,'YEAR')
------------------------------------------
TWENTY THIRTEEN

SQL>
SQL> SELECT to_char(SYSDATE ,'YYYY') FROM DUAL;

TO_C
----
2013

TO_CHAR中的W与D

SQL> select to_char(sysdate,'W') from dual; --一个W代表查询时间是1个的第几周

T
-
3


SQL> select to_char(sysdate,'WW') from dual; --两个WW代表查询时间是1年的第几周

TO
--
03

SQL> select to_char(sysdate,'d') from dual; --一个D代表一周的第几天(老外周一是星期日)

T
-
5


SQL> select to_char(sysdate,'dd') from dual;  --2个D就是取sysdate的日期部分

TO
--
17
SQL> select to_char(sysdate,'ddd') from dual; --表示现在是一年当中的第几天

TO_
---
017


SQL> select to_char(sysdate,'dddd') from dual; --四个D其实就是DDD的结果||D的的结果-一年中的第17天,一周的第五天。

TO_C
----
0175
补充内容YY与RR

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

TO
--
13

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

TO
--
13



YY与RR都表示年,一般外国人都用RR而国内都用YY,他们之间有区别吗,有的!
YY:输出的世纪一定跟当前时间的世纪保持一致
RR:见下图