Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的select语句块中。
SELECT * FROM DUAL;
-- X
SELECT USER FROM DUAL;
-- 返回当前用户名
查询当前日期,返回的为时区0的时间
SELECT SYSDATE FROM DUAL;
-- 2017/7/27 2:16:11
查询今天为几月几号
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM DUAL;
-- 2017-07-27
查询当前时间,并设置格式,到秒级别
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH:MI:SS') FROM DUAL;
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -- 24小时制
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MM:SS') FROM DUAL; -- 不能用MM表示分钟,会输出月份
-- 2017-07-27 02:16:37
将字符串按照一定格式转换为时间类型
SELECT TO_DATE('2017-07-27 12:00:00','YYYY-MM-DD HH24:MI:SS') AS DTIME FROM DUAL;
-- 2017/7/27 12:00:00
时间运算
求当前时间的一个差值
SELECT SYSDATE,SYSDATE-(INTERVAL '10' MINUTE) AS NEWTIME FROM DUAL;
-- 2017/7/27 2:52:59 2017/7/27 2:42:59
INTERVAL 字符数字 单位
字符数据必须是字符,不能为单纯的数字
单位可以是 MINUTE HOUR DAY MONTH YEAR 等,即减去相应的时间单位
SELECT ROUND(TO_NUMBER(SYSDATE-(SYSDATE-(INTERVAL '10' HOUR)))) AS IDAY FROM DUAL;
-- 0 (天)
SELECT ROUND(TO_NUMBER(SYSDATE-(SYSDATE-(INTERVAL '20' HOUR)))) AS IDAY FROM DUAL;
-- 1 (天)
SELECT ROUND(TO_NUMBER(SYSDATE-(SYSDATE-(INTERVAL '10' DAY)))) AS IDAY FROM DUAL;
-- 10 (天)
SELECT ROUND(TO_NUMBER(SYSDATE-(SYSDATE-(INTERVAL '10' YEAR)))) AS IDAY FROM DUAL;
-- 3653 (天)
由上面几天语句可以看出,计算的时间差单位是天
将时间转换为数字,并不是转成十进制那样的数字。
SELECT TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDDHHMISS')) FROM DUAL;
-- 20170727034152
接下来是ORACLE日期类型常用的相关函数说明及举例。
1、LAST_DAY() 获取一个日期的最后一天
SELECT LAST_DAY(SYSDATE) FROM DUAL;
-- 2017/7/31 3:41:43
2、ADD_MONTHS(DATE,N) 将日期增加N个月,这个N可以是负数:-10,即往前查10个月。
SELECT ADD_MONTHS(SYSDATE,10) FROM DUAL;
-- 2018/5/27 3:41:33
3、MONTHS_BETWEEN(DATE1,DATE2) 两个日期之间相差的月数,如果DATE2大于DATE1,结果为负值。
SELECT MONTHS_BETWEEN(SYSDATE,SYSDATE-INTERVAL '10' MONTH) FROM DUAL;
-- 10
4、NEXT_DAY(DATE,DAY_OF_WEEK) 得到下周第N天的日期
SELECT NEXT_DAY(SYSDATE,3) FROM DUAL;
-- 2017/8/1 3:49:59
5、CURRENT_DATE() 返回当前时区的当前时间,而SYSDATE是本初子午线时间,即时区0的时间
SELECT SESSIONTIMEZONE,CURRENT_DATE FROM DUAL;
-- +08:00 2017/7/27 11:53:04
SELECT SESSIONTIMEZONE,SYSDATE FROM DUAL;
-- +08:00 2017/7/27 3:58:27
6、CURRENT_TIMESTAMP() 以timestamp with time zone 数据类型返回当前会话时区中的当前日期
SELECT CURRENT_TIMESTAMP FROM DUAL;
-- 27-7月 -17 12.01.34.133947 下午 +08:00
其它:
获取上月的最后一天的日期
SELECT TO_CHAR(LAST_DAY(SYSDATE-INTERVAL '1' MONTH),'YYYY-MM-DD') FROM DUAL;
统计当前日期是本年的第几周
SELECT TO_CHAR(SYSDATE-INTERVAL '1' MONTH,'WW') FROM DUAL;
– 时间大小的比较 大于小于等
SELECT CASE WHEN TRUNC(SYSDATE,'DD') = TO_DATE('2017-07-27','YYYY/MM/DD) THEN 1 ELSE 0 END FROM DUAL;