2016-06-14 43 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

相關問題