2016-06-14 39 views
2

我几天来一直在这个问题上进行任务,并且我一直无法获得正确的查询。我的导师一直不太有用。问题如下:Oracle SQL - 两天前和七天后发生的周年纪念

“系统会要求您准备两天前和七天后发生的员工纪念日清单,该列表应从EMPLOYEES表中检索包含EMPLOYEE_ID,FIRST_NAME,LAST_NAME的行,JOB_ID和HIRE_DATE列根据HIRE_DATE值的日期和月份组成升序排列,另外一个表达式为ANNIVERSARY的表达式需要根据下表返回一个描述性消息,有几种方法可以解决这个问题:

招聘意向DAY ------------------------- 消息
前两天------------------------前天
前一天-------------- -----------昨天
今天----------------------------------今天
明天-----------------------------明天
未来两天---------- ----明天从今天
七天内----本周晚些时候又一天

提示:使用CASE/WHEN,TO_CHAR和TO_NUMBER功能
您的结果将取决于哪个日期执行查询的不同而不同“。

我已经能够想出下面的查询,但它并没有考虑到当它是一年的结束和纪念日是在一月初:

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

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 
+0

我应该在我使用Oracle 11g文件中指明,它似乎并没有认识到DATESERIAL()。 – Godiegogo

+0

显然,Oracle的'DateSerial(year,month,day)'等价(在其他SQL方言中)是'MAKEDATE(year month day)'(不含逗号)。 –

+0

非常感谢您的帮助! – Godiegogo

相关问题