Oracle时间日期函数及sql语句

一、时间日期函数 

  • to_date函数 

to_date的格式:to_date(‘要转换的时间’,’转换成的时间格式’), 两个参数的格式必须匹配,否则会报错。 

需要注意的是,在Java中的时间格式是“yyyy-MM-dd HH:mm:ss”,但是在oracle的sql中由于不区分大小写,时间格式中的“mm”将被识别为月,导致出现“ORA 01810 格式代码出现两次”的错误。所以Oracle的SQL采用了mi代替分钟,oracle的全时间格式为“yyyy-MM-dd HH24:mi:ss”。同时,要以24小时时间的形式显示出来要用HH24,而不是HH。 

  • to_char(日期,”转换格式” )

即把给定的日期按照“转换格式”转换。 

转换的格式: yyyy 用4位数表示年,mm 用2位数字表示月,dd 表示当月第几天。同时,用q表示季度,用ww 来表示当年第几周,w用来表示当月第几周。ddd表示当年第几天,dd 表示当月第几天,d表示这个星期的第几天。 

 

时间相关的sql语句 

(1) 查询转换时间格式

select  to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')  from  dual; 

(2) 取得当前日期是一个星期中的第几天

 select  to_char(sysdate,'D')  from  dual;      ---取得当前日期是一个星期中的第几天

ps:根据上面列出的转换格式,有很多类似的查询如下:

select  to_char(sysdate,'Q')  from  dual;        --当前日期所在季度   
select  to_char(sysdate,'mm')  from  dual;       --当前日期在本年的第几个月
select  to_char(sysdate,'ww')  from  dual;       --当前日期是‘本年’的第几周
select  to_char(sysdate,'w')  from  dual;        --当前日期是‘本月’的第几周
select  to_char(sysdate,'ddd')  from  dual;      --当前日期是本年第几天
select  to_char(sysdate,'dd')  from  dual;       --当前日期是本月第几天

(3) 取当前日期是星期几中文显示

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

(4) 给现有日期加/减月(年)份 

这里是使用add_months函数实现年月的加减。add_months是运算函数,函数将传入的日期上加上/减去月份数,所以,日期中的日一般是不变的。然而,如果传入的日期是某月的最后一天,那么,结果将会调整以使返回值仍对应新的一月的最后一天。如果,结果月份的天数比开始月份的天数少,那么,也会向回调整以适应有效日期。
 

select add_months(sysdate,24) from dual;      --加上两年
select add_months(sysdate,-24) from dual;     --减去两年
select add_months(sysdate,3) from dual;       --加上三个月
select add_months(to_date('2017-01-31','yyyy-mm-dd'),1) from dual;   --由于一月的最后一天是31号,而加一个月,二月份只有28天,所以返回的结果是2017-2-28。

(5) 判断某一日子所在年分是否为润年

select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from dual;

(6) 当前时间减去七年

select sysdate,sysdate - interval '7' year from dual;   --当前时间减去七年

ps:有很多类似的查询如下:

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 - 7 from dual;                            --当前时间减去7天的时间,由于sysdate系统默认就是天数,所以可以不用函数,直接减去(7加不加引号都可)
select sysdate,sysdate - interval '7' month from dual;   --当前时间减去7月的时间 

(7)查询日期之间的数据 

例如查询student表中出生日期(birthday)在’2016-01-01’ 和’2017-01-01’之间的数据:

select * from student where birthday between '2016-01-01' and '2017-01-01';   

对于日期不规则的数据需要先转格式,如下:

select * from student where to_date(student.birthday,'YYYY-MM-DD') between to_date('2016/01/01','YYYY-MM-DD')  and to_date('2017/01/01','YYYY-MM-DD');

(8)查询小于或者大于某日期的数据 

例如查询student表中出生日期(birthday)小于等于’2016-01-01’的数据:

select * from student where birthday <='2007-1-13';

对于日期不规则的数据需要先转格式,如下:

select * from student where to_date(student.birthday,'YYYY-MM-DD') <= to_date('2016/01/01','YYYY-MM-DD');

(9)关于在xml文件中大于和小于符号的处理 

在mybatis的mapper.xml文件中,由于xml文件将大于小于符号识别为特殊符号,所以不允许出现类似“>”这样的字符。这种情况下,需要使用转义,用了转义字符把>和<替换掉,就没有问题了。 

转义列表: 

&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; ' 单引号
&quot; " 双引号
select * from student where 1 = 1 and birthday  &lt;= '2017-01-01' AND birthday &gt;= '20160101'

对于xml中还有一种方式:  <![CDATA[ SQL语句 ]]

因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用

select * from student where <![CDATA[ TO_DATE(student.birthday,'YYYY-MM-DD') < TO_DATE('20170101','YYYY-MM-DD') ]]>

(10)伪列dual 

Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的select语句块中。比如,“select sysdate from dual”获取系统当前时间。”select user from dual”则返回当前连接的用户。如果是”select 1+2 from dual”,则返回结果3。

猜你喜欢

转载自blog.csdn.net/Asa_Prince/article/details/84304719