在我们安装了Oracle之后,SYS用户就会存在一个DUAL表,它只有一个字段,一条记录,如下所示:
SQL>select * from dual;
D——完整列名为DUMMY
-
X
当我们执行语句select count(*) from dual;时,得到的结果为1,这也就证实了DUAL表中只有一行一列。
我们可以向这个表中插入、修改、删除记录,但在这些操作之后,如果记录数不为1,可能会引起很多地方查询错误,建议不要修改。
了解了这些,我们再来看一下DUAL表的使用:
NO1.
SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual;
'ss'——取当前时间秒部分
'mi'——取当前时间分钟部分
'hh24'——取当前时间秒小时部分
'dd'——取当前时间日期部分
'mm'——取当前时间月部分
'yyyy'——取当前时间年部分
'w'——取当前时间是一个月中的第几周(从1日开始算)
'ww'——取当前时间是一年中的第几周(从1.1开始算)
'iw'——取当前时间是一年中的第几周(按实际日历的)
'day'——取当前日是星期几,和数据库设置的字符集有关,如果安装时字符集是ZH~,会输出星期六,若是英文,则输出Saturday
'd'——当前日是一周中的第几天,1表示星期天,7表示星期六
'ddd'——当前日是一年中的第几天
如果查询语句如select sysdate from dual;结果为25-7月 -09
NO2.
trunc,也就是truncate函数,同其英文单词意思一样,是截断的意思(不会四舍五入),如下两个数字例子:
select trunc(1234.567),trunc(1234.567,2),trunc(1234.567,-2) from dual;
1234 1234.56 1200
从结果中可看到,如果不给予截断长度,默认是取整,如果是正整数,则从最后一位小数开始取位数截断,如果是负整数,则从小数点前开始截断。
对于时间来说,截断情况如下所示(测试时间为2009-7-25):
select trunc(sysdate,'mm') from dual;结果显示:01-7月 -09
select trunc(sysdate,'mm')+1 from dual;结果显示:02-7月 -09
select trunc(add_months(sysdate,1),'mm') - 1 from dual;结果显示:31-7月 -09
trunc函数内若只有一个参数,那该函数以天为单位。
得到一年的每一天:select trunc(sysdate,'yyyy')+ rn -1 date0 from (select rownum rn from all_objects where rownum<366);
返回某个月的最后一天:select to_char(last_day(sysdate),'dd') from dual;
判断某一日子所在年分是否为润年:select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from dual;
判断两年后是否为润年:select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','平年') from dual;
SQL>select * from dual;
D——完整列名为DUMMY
-
X
当我们执行语句select count(*) from dual;时,得到的结果为1,这也就证实了DUAL表中只有一行一列。
我们可以向这个表中插入、修改、删除记录,但在这些操作之后,如果记录数不为1,可能会引起很多地方查询错误,建议不要修改。
了解了这些,我们再来看一下DUAL表的使用:
NO1.
SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual;
'ss'——取当前时间秒部分
'mi'——取当前时间分钟部分
'hh24'——取当前时间秒小时部分
'dd'——取当前时间日期部分
'mm'——取当前时间月部分
'yyyy'——取当前时间年部分
'w'——取当前时间是一个月中的第几周(从1日开始算)
'ww'——取当前时间是一年中的第几周(从1.1开始算)
'iw'——取当前时间是一年中的第几周(按实际日历的)
'day'——取当前日是星期几,和数据库设置的字符集有关,如果安装时字符集是ZH~,会输出星期六,若是英文,则输出Saturday
'd'——当前日是一周中的第几天,1表示星期天,7表示星期六
'ddd'——当前日是一年中的第几天
如果查询语句如select sysdate from dual;结果为25-7月 -09
NO2.
trunc,也就是truncate函数,同其英文单词意思一样,是截断的意思(不会四舍五入),如下两个数字例子:
select trunc(1234.567),trunc(1234.567,2),trunc(1234.567,-2) from dual;
1234 1234.56 1200
从结果中可看到,如果不给予截断长度,默认是取整,如果是正整数,则从最后一位小数开始取位数截断,如果是负整数,则从小数点前开始截断。
对于时间来说,截断情况如下所示(测试时间为2009-7-25):
select trunc(sysdate,'mm') from dual;结果显示:01-7月 -09
select trunc(sysdate,'mm')+1 from dual;结果显示:02-7月 -09
select trunc(add_months(sysdate,1),'mm') - 1 from dual;结果显示:31-7月 -09
trunc函数内若只有一个参数,那该函数以天为单位。
得到一年的每一天:select trunc(sysdate,'yyyy')+ rn -1 date0 from (select rownum rn from all_objects where rownum<366);
返回某个月的最后一天:select to_char(last_day(sysdate),'dd') from dual;
判断某一日子所在年分是否为润年:select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from dual;
判断两年后是否为润年:select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','平年') from dual;
得到日期的季度:select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;或者select to_char(sysdate, 'Q') from dual;