日期函数:解决闰年,计算准确的问题;
想要进行日期的操作必须知道当前日期:可以使用SYSDATE伪列取得当前日期。
1. ADD_MONTHS(日期,数字):在指定的日期上加入指定月数,求出新的日期;
2. MONTHS_BETWEEN(日期1,日期2):求出两个日期间的雇拥月数;
3. NEXT_DAY(日期,星期数):求出下个日期的最后一天日期;
4. LAST_DAY(日期):求出限定日期月的最后天日期;
5. EXTRACT(格式FROM数据):日期时间分割,或计算限定两个日期的间隔;
伪列:不是表中的列,但是可以在查询中使用;
SELECTSYSDATE
FROM dual;
查询当前日期操作:
1.ALTERSESSION SET NLS_DATE_FORMAT=’yyyy-mm-dd hh24:mi:ss’;(修改语言环境)
2.SELECT SYSDATEFROM dual;
日期操作公式:
日期-数字(天数)=日期
日期+数字(天数)=日期
日期-日期=数字(天数):没有日期+日期;
范例操作:
SELECT
SYSDATE - 3 前三天,
SYSDATE + 3 后三天
FROM dual;
1. 查出每个雇员到今天为止雇佣天数,以及十天前每个雇员的雇佣天数:
SELECT
empno 雇员编号,
ename 雇员名称,
TRUNC(SYSDATE-hiredate) 雇佣天数,
TRUNC((SYSDATE-10)-hiredate) 十天前的雇拥天数
FROM emp;
2. 验证ADD_MONTHS()函数:
SELECT SYSDATE,
ADD_MONTHS(SYSDATE,3) 三个月之后的日期
ADD_MONTHS(SYSDATE,-3) 三个月之前的日期
FROM dual;
3. 验证NEXT_DAY()函数:
SELECT SYSDATE,
NEXT_DAY(SYSDATE,'星期日') 下一个星期日的日期,
NEXT_DAY(SYSDATE,'星期一') 下个星期一的日期
FROM dual;
4. 验证LAST_DAY()函数:
SELECT
LAST_DAY(SYSDATE)
FROM dual;
查询所有是在其雇拥所在月的倒数第三天被公司雇拥的雇员信息:
SELECTempno,ename,job,hiredate,LAST_DAY(hiredate)
FROM emp
WHERELAST_DAY(hiredate)-2=hiredate;
5. MONTHS_BETWEEN()函数:
查询每个雇员的编号,姓名,雇拥日期,雇拥的月数及年份:
SELECT
empno,
ename,
hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate))雇拥总月数,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12)雇拥总年份
FROMemp;
查询每个雇员的编号,姓名,雇佣日期,已雇佣的多年份零多少个月零几天:
SELECTempno,ename,hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 雇佣的年份,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) 雇佣的月份,
TRUNC(SYSDATE - ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate)))雇佣的天数
FROM emp;
6. EXTRACT()函数:
分离日期“2017-02-01”:
SELECT
EXTRACT(YEAR FROM DATE '2017-02-01') YEARS,
EXTRACT(MONTH FROM DATE '2017-02-01') MONTHS,
EXTRACT(DAY FROM DATE '2017-02-01') DAYS
FROM dual;
取得时间的毫秒:
SELECT
SYSDATE, SYSTIMESTAMP
FROM dual;
取得更详细的时间:
SELECT
EXTRACT(YEAR FROM SYSTIMESTAMP) YEARS,
EXTRACT(MONTH FROM SYSTIMESTAMP) MONTHS,
EXTRACT(DAY FROM SYSTIMESTAMP) DAYS,
EXTRACT(HOUR FROM SYSTIMESTAMP) HUORS,
EXTRACT(MINUTE FROM SYSTIMESTAMP) MINUTES,
EXTRACT(SECOND FROM SYSTIMESTAMP) SECONDS
FROM dual;
7. 转换函数TO_TIMESTAMP(),可以将字符串变为时间戳:
SELECT
TO_TIMESTAMP('2015-02-1612:13:14','yyyy-mm-dd hh24:mi:ss'),
TO_TIMESTAMP('2018-02-15 13:14:15','yyyy-mm-dd hh24:mi:ss')
FROM dual;
求得两个时间的间隔天数:
SELECT
EXTRACT(DAY FROM TO_TIMESTAMP('2015-02-16 12:13:14','yyyy-mm-ddhh24:mi:ss')-
TO_TIMESTAMP('2012-02-15 13:14:15', 'yyyy-mm-dd hh24:mi:ss')) DAYS
FROM dual;
运用子查询查询分秒:
SELECT
EXTRACT(DAY FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-ddhh24:mi:ss')-
TO_TIMESTAMP('1981-09-27 09:08:33', 'yyyy-mm-dd hh24:mi:ss')) DAYS,
EXTRACT(HOUR FROM DATETIME_ONE - DATETIME_TWO) HOURS,
EXTRACT(MINUTE FROM DATETIME_ONE - DATETIME_TWO) MINUTES,
EXTRACT(SECOND FROM DATETIME_ONE - DATETIME_TWO) SECONDS
FROM (
SELECT TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss')DATETIME_ONE,
TO_TIMESTAMP('1981-09-27 09:08:33', 'yyyy-mm-dd hh24:mi:ss')DATETIME_TWO
FROM dual);