我已经在这个问题上做了几天的任务,而且我还没有能够得到正确的查询。我的导师一直没那么乐于助人。问题如下:
"要求您准备两天前至七天之间发生的员工纪念日清单。该列表应根据HIRE_DATE值的日期和月份组件,按升序从EMPLOYEES表中检索包含EMPLOYEE_ID,FIRST_NAME,LAST_NAME,JOB_ID和HIRE_DATE列的行。需要另外一个表示为ANNIVERSARY的表达式,以根据下表返回描述性消息。有几种方法可以解决这个问题。
招聘日 ------------------------- 留言
两天前------------------------前天日
一天前-------------------------昨天
今天----------------------------------今天
明天-----------------------------明天
未来两天--------------后天日
从今天起的七天内----本周晚些时候
提示:使用CASE / WHEN,TO_CHAR和TO_NUMBER函数
您的结果将根据您执行查询的日期而有所不同。"
我已经能够提出以下查询,但它没有考虑到年底和周年纪念日是在1月初:
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, HIRE_DATE,
CASE WHEN TO_DATE(TO_CHAR(HIRE_DATE,'DDMM'),'DDMM') - TRUNC(SYSDATE) = -2 THEN 'Day before yesterday'
WHEN TO_DATE(TO_CHAR(HIRE_DATE,'DDMM'),'DDMM') - TRUNC(SYSDATE) = -1 THEN 'Yesterday'
WHEN TO_DATE(TO_CHAR(HIRE_DATE,'DDMM'),'DDMM') - TRUNC(SYSDATE) = 0 THEN 'Today'
WHEN TO_DATE(TO_CHAR(HIRE_DATE,'DDMM'),'DDMM') - TRUNC(SYSDATE) = 1 THEN 'Tomorrow'
WHEN TO_DATE(TO_CHAR(HIRE_DATE,'DDMM'),'DDMM') - TRUNC(SYSDATE) = 2 THEN 'Day after tomorrow'
WHEN TO_DATE(TO_CHAR(HIRE_DATE,'DDMM'),'DDMM') - TRUNC(SYSDATE) BETWEEN 2 AND 7 THEN 'Later this week'
ELSE TO_CHAR(HIRE_DATE, 'MON-DD')
END
AS "ANNIVERSARY"
FROM EMPLOYEES
ORDER BY TO_CHAR(HIRE_DATE, 'MMDD');
任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
CASE expressions分为两种:
CASE expr WHEN value THEN result WHEN value THEN result ...
CASE WHEN condition THEN result WHEN cond THEN result ...
我结合两者,一个返回天差数(内部)。此结果用作确定消息的第二个(外部)案例表达式中的表达式。
内部案例表达式处理年边界处的两个边缘情况和一个正常情况。
SELECT CASE
CASE WHEN EXTRACT(MONTH FROM SYSDATE) = 1 AND EXTRACT(MONTH FROM HIRE_DATE) = 12 THEN
MAKEDATE(EXTRACT(YEAR FROM SYSDATE)-1 12 EXTRACT(DAY FROM HIRE_DATE)) - TRUNC(SYSDATE)
WHEN EXTRACT(MONTH FROM SYSDATE) = 12 AND EXTRACT(MONTH FROM HIRE_DATE) = 1 THEN
MAKEDATE(EXTRACT(YEAR FROM SYSDATE)+1 1 EXTRACT(DAY FROM HIRE_DATE)) - TRUNC(SYSDATE)
ELSE
MAKEDATE(EXTRACT(YEAR FROM SYSDATE) EXTRACT(MONTH FROM HIRE_DATE) EXTRACT(DAY FROM HIRE_DATE)) -
TRUNC(SYSDATE)
END
WHEN -2 THEN '...'
WHEN -1 THEN '...'
...
ELSE ...
END