一、时间日期函数
1.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表示这个星期的第几天。
2.时间相关的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,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文件将大于小于符号识别为特殊符号,所以不允许出现类似“>”这样的字符。这种情况下,需要使用转义,用了转义字符把>和<替换掉,就没有问题了。
转义列表:
select * from student where 1 = 1 and birthday <= '2017-01-01' AND birthday >= '20160101'
对于xml中还有一种方式:
因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用
select * from student where
(10)伪列dual
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的select语句块中。
比如,“select sysdate from dual”获取系统当前时间。”select user from dual”则返回当前连接的用户。如果是”select 1+2 from dual”,则返回结果3。