第3章 日期函数 1. 计算 2000 年 1 月 1 日到现在有多少月,多少周(四舍五入)。
1 2 3 4 SELECT ROUND(MONTHS_BETWEEN(SYSDATE, TO_DATE('2000-1-1' , 'yyyy-mm-dd' ))) AS 月数, ROUND((SYSDATE - TO_DATE('2000-1-1' , 'yyyy-mm-dd' )) / 7 ) AS 周数 FROM dual;
2. 将员工工资按如下格式显示:123,234.00 RMB。
1 SELECT TO_CHAR(123234.00 , '999,999.00' ) || ' RMB' FROM dual;
3. 将员工的参加工作日期按如下格式显示:月份/年份。
1 SELECT TO_CHAR(hiredate, 'MM/YYYY' ) FROM emp;
4. 将当前系统时间格式化为 ‘YYYY-MM-DD HH24:MI:SS’ 输出。
1 SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS' ) FROM dual;
5. 查询 emp
表,将入职时间格式化为 ‘YYYY-MM-DD HH24:MI:SS’ 显示。
1 SELECT TO_CHAR(hiredate, 'YYYY-MM-DD HH24:MI:SS' ) FROM emp;
6. 将当前时间加一年后格式化输出显示。
1 SELECT ADD_MONTHS(SYSDATE, 12 ) FROM dual;
7. 将当前时间减 12 个月然后输出。
1 SELECT ADD_MONTHS(SYSDATE, -12 ) FROM dual;
8. 查询下一个星期一显示输出。
1 SELECT NEXT_DAY(SYSDATE, '星期一' ) FROM dual;
9. 查询当前月份的最后一天显示输出。
1 SELECT LAST_DAY(SYSDATE) FROM dual;
10. 查询 emp
表中人员入职的天数。
1 SELECT ROUND(SYSDATE - hiredate) AS 入职天数 FROM emp;
11. 查询 emp
表中入职时间满 10 年的员工。
1 SELECT * FROM emp WHERE MONTHS_BETWEEN(SYSDATE, hiredate) / 12 > 10 ;
12. 查询 emp
表中 2000 年后入职的员工。
1 SELECT * FROM emp WHERE TO_CHAR(hiredate, 'YYYY' ) > 2000 ;
13. 查询 emp
表中所有 98 年 3 月入职的员工。
1 SELECT * FROM emp WHERE EXTRACT (YEAR FROM hiredate) = 1981 AND EXTRACT (MONTH FROM hiredate) = 3 ;
14. 查询 emp
表中所有在 3 月入职的人。
1 SELECT * FROM emp WHERE EXTRACT (MONTH FROM hiredate) = 3 ;
15. 查询当前时间距离 ‘1998-8-2’ 的月数。
1 SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('1998-8-2' , 'yyyy-mm-dd' )) FROM dual;
16. 将当前时间减 12 个月然后输出。
1 SELECT ADD_MONTHS(SYSDATE, -12 ) FROM dual;
17. 查询下一个星期一显示输出。
1 SELECT NEXT_DAY(SYSDATE, '星期一' ) FROM dual;
18. 查询一个月的最后一天显示输出。
1 SELECT LAST_DAY(SYSDATE) FROM dual;
19. 查询 emp
表中入职时间在下半个月的员工。
1 SELECT * FROM emp WHERE TO_CHAR(hiredate, 'DD' ) > 15 ;
20. 查询 emp
表中上半年入职的员工。
1 SELECT * FROM emp WHERE TO_CHAR(hiredate, 'MM' ) < 7 ;
21. 将数字 825398374.3762 格式化成字符串后输出。
1 SELECT TO_CHAR(825398374.3762 ) FROM dual;
22. 字符串变数字 ‘RMB825,398,374.38’。
1 SELECT 'RMB' || TO_CHAR(TO_NUMBER('825398374.38' ), '999,999,999.00' ) FROM dual;
23. 查询 emp
表,将员工薪水以 ‘$999,999,999.00’ 格式显示。
1 SELECT TO_CHAR(sal, '$999,999,999.00' ) FROM emp;
24. 使用函数 NVL2
查询所有员工的基本工资(薪水 + 奖金)。
1 SELECT sal + NVL2(comm, comm, 0 ) AS 基本工资 FROM emp;
25. 使用函数 NVL
查询所有员工的基本工资(薪水 + 奖金)。
1 SELECT sal + NVL(comm, 0 ) AS 基本工资 FROM emp;
26. 查询 emp
表中入职时间在下半个月的员工。
1 SELECT * FROM emp WHERE TO_CHAR(hiredate, 'DD' ) > 15 ;
27. 查询 emp
表中上半年入职的员工。
1 SELECT * FROM emp WHERE TO_CHAR(hiredate, 'MM' ) < 7 ;
28. 查询部门 10 和 20 的员工截止到 2000 年 1 月 1 日,工作了多少个月,入职的月份。(提示:使用 MONTHS_BETWEEN
)
1 2 3 4 5 SELECT ROUND(MONTHS_BETWEEN(TO_DATE('2000-1-1' , 'yyyy-mm-dd' ), hiredate)) AS 工作月数, TO_CHAR(hiredate, 'MM' ) AS 入职月份FROM emp WHERE deptno IN (10 , 20 );
29. 如果员工试用期 6 个月,查询职位不是 MANAGER 的员工姓名、入职日期、转正日期、入职日期后的第一个星期一、入职当月的最后一天日期。(提示:使用 ADD_MONTHS
、NEXT_DAY
、LAST_DAY
)
1 2 3 4 5 6 7 8 SELECT ename, hiredate, ADD_MONTHS(hiredate, 6 ) AS 转正日期, NEXT_DAY(hiredate, '星期一' ) AS 第一个星期一, LAST_DAY(hiredate) AS 当月最后一天FROM emp WHERE job != 'MANAGER' ;
30. 显示 ename
、hiredate
和雇员开始工作日是星期几(提示:使用 TO_CHAR
函数)。
1 SELECT ename, hiredate, TO_CHAR(hiredate, 'DY' ) AS 星期几 FROM emp;
31. 查询员工姓名、工资、格式化的工资(¥999,999.99)(提示:使用 TO_CHAR
函数)。
1 SELECT ename, sal, '¥' || TO_CHAR(sal, '999,999.00' ) AS 格式化工资 FROM emp;
32. 把字符串 ‘2015-3月-18 13:13:13’ 转换成日期格式,并计算和系统当前时间间隔多少天(提示:使用 TO_DATE
函数)。
1 2 3 4 SELECT TO_DATE('2015-3-18 13:13:13' , 'yyyy-mm-dd hh24:mi:ss' ) AS 转换日期, ROUND(SYSDATE - TO_DATE('2015-3-18 13:13:13' , 'yyyy-mm-dd hh24:mi:ss' )) AS 间隔天数FROM dual;