2017-08-11 63 views
1

我正在嘗試創建一個視圖,用於比較具有以下值的SCHEDULE表(例如('Daily','Wednesday', 'Tuesday'等)和另一個表格(REPORT CREATED),每天更新日期(11-AUG-2017)。基本上,如果Schedule表顯示Daily,那麼Report Created表記錄值應該是sysdate(當前日期)等於的值。也就是說,我不確定如何找出最近的「星期三」或「星期二」等於什麼。我確實找到了SQL服務器的功能(How to get Saturday's Date (Or any other weekday's Date)- SQL Server);但是,我不明白它是如何工作的,並且無法在Oracle中找到等價物。任何指導將不勝感激!ORACLE在過去7天給定工作日的查找日期('DD-MON-YYYY')

編輯:我已經創建了兩個示例表:

調度表:

Report_Name | Frequency 
ORDERS_BY_DEPT | Daily 
LOW_STOCK | Wednesday 
INVENTORY_DISC | Thursday 

和報告表:

Report_Name | Create_Dt 
INVENTORY_DISC | 3-Aug-2017 
LOW_STOCK | 9-Aug-2017 
ORDERS_BY_DEPT | 10-Aug-2017 

所以基本上,該Inventory_Disc報告是關閉的,因爲它應該在每個星期四運行,但自上週四以來沒有更新,Orders_By_Dept報告已關閉,因爲它是每日報告,並且今天沒有運行。

+0

過濾器在過去7天,並用平日的加盟表達... –

+1

請提供[MCVE] - 表的數據,預計輸出,等等。 – OldProgrammer

+1

你可以添加一個示例數據: –

回答

4

使用NEXT_DAY(date_value, day_string)功能。取當前日期(SYSDATE)並從中減去7天,然後找到與您所需的每週星期匹配的第二天。

因此,要獲得最新的星期三:

SELECT NEXT_DAY(TRUNC(SYSDATE) - 7, 'WEDNESDAY') 
FROM DUAL 
+0

這是一個更好的方法:) – Andomar

+0

@ MT0謝謝你的迴應。我相信這絕對是方向。也就是說,當我這樣做時,我收到一個錯誤。我的SQL是:SELECT a.report_name,CASE a.frequency WHEN'Daily'THUN TRUNC(SYSDATE)ELSE NEXT_DAY(SYSDATE - 7,a.frequency)END expected_dt,b.create_dt from schedule a LEFT OUTER JOIN報告b on .report_name = b.report_name);當我運行這個時,我得到的錯誤:ORA-00932,不一致的數據類型:期望的CHAR得到DATE,行/列指向NEXT_DAY函數中的a.frequency。 –

+0

也就是說,a.frequency列是varchar2,所以我不確定它如何被識別爲日期 –

0

您可以找到day of the week有:

to_char(sysdate, 'D') 

因此,例如,上週四是:

select case 
     when to_char(sysdate, 'D') < 4 then sysdate - to_char(sysdate, 'D') - 7 + 4 
     else sysdate - to_char(sysdate, 'D') + 4 
     end 
from dual 
+1

'TO_CHAR(date,'D')'依賴於'NLS_TERRITORY'設置,並且根據它運行的世界的不同位置給出不同的結果。 'ALTER SESSION SET NLS_TERRITORY ='AMERICA'; SELECT TO_CHAR(DATE'2017-08-11','D')FROM DUAL;'outputs'6',但如果你做'ALTER SESSION SET NLS_TERRITORY ='UNITED KINGDOM';'那麼它輸出'5'。如果今天是星期一,並且您需要上一個星期二,因爲您需要返回前一週,則還會遇到問題。 – MT0

+0

@ MT0:同意,它需要當地的天數(美國的星期四爲5)。 'case'應該正確處理上週。 'next_day()'是更好的選擇,雖然 – Andomar