最近有在看OCP的教材,对其中几个经典的题目做个记录(案例:HR):
问题一:显示每一个员工的姓氏、聘用日期和薪金复核日期,薪金复核日期是服务六个月之后的第一个星期一。将该列标记为REVIEW。规定这一日期的格式,使其显示类似于:“Monday,the
Thirty-First of July,2000",结果如下图所示:
FIRST_NAME
HIRE_DATE
REVIEW
-------------------- -----------
------------------------------------------------------
Hermann
6/7/2002
Monday ,the NINTH of December
,2002
Shelley
6/7/2002
Monday ,the NINTH of December
,2002
William
6/7/2002
Monday ,the NINTH of December
,2002
最初的时候我看错了题意,结果写成了列到这个星期的星期一的句子:
SELECT first_name,
hire_date,
to_char( ( add_months(hire_date,6) - to_char(
add_months(hire_date,6),'D' ) + 2 ),
'Day,"the" DDSPTH "of"
Month,YYYY'
) review
FROM employees;
在ORACLE中,可以通过to_char来获得一个星期中的第几天,当然,这个是从星期天开始的(星期天为1),这样就不难理解上面的粗体部分的加上2是什么意思了
当然,上面的SQL还可以用到next_day的一个参数,上面的参数可以这样写了:
SELECT first_name,
hire_date,
to_char( next_day(add_months(hire_date,6),'mon')
- 7,
'Day,"the" DDSPTH "of"
Month,YYYY'
) review
FROM employees;
留意上文的黑色部分,用next_day获取了下一个星期一的日期,减去7就是这个星期的。
但是事实上,我们需要的是下个周一的日期:
SELECT first_name,
hire_date,
to_char(
next_day(add_months(hire_date,6),'mon'),
'Day,"the" DDSPTH "of"
Month,YYYY'
) review
FROM employees;
问题二:显示员工的姓氏、聘用日期和该员工在星期几开始工作的,将该列标记为DAY,按照星期中个天的顺序进行排序(星期一为第一天)
其实这个问题的关键点在于,在ORACLE中,星期天才是第一天,如果安装1-7的序号来排序的话,星期天是肯定在第一个的,那么我们要怎么做到将其拍到尾部,接下来看下面的SQL:
SELECT first_name,
hire_date,
DAY
FROM (
SELECT
first_name,
hire_date,
to_char(hire_date,'DAY') DAY,
CASE
to_char(hire_date,'D')
WHEN '1' THEN '8'
ELSE
to_char(hire_date,'D')
END
NUM
FROM
employees
ORDER
BY NUM
)
可以看到,在内层查询中,我们将星期天的代码替换成了8,然后再排序的话,星期天就能排在了星期六的后面了,多奇特!