Oracle SQL - 两天前和七天之后发生的周年纪念日

时间:2016-06-14 16:44:08

标签: sql oracle

我已经在这个问题上做了几天的任务,而且我还没有能够得到正确的查询。我的导师一直没那么乐于助人。问题如下:

"要求您准备两天前至七天之间发生的员工纪念日清单。该列表应根据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');

任何帮助将不胜感激!谢谢!

1 个答案:

答案 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