2016-09-12 10 views
-1

我有以下Oracle SQL查詢。我想使用適當的日期函數爲下面的給定的日期,這是硬編碼在下面的Oracle SQL查詢

select p_name, 
     cal_vale, 
     St_val, 
     l_date 
from pr_tab 
where L_date = to_date('03-sep-16','dd-mon-yy'); 

這裏03-Sep-16是硬編碼的日期值,從數據庫中獲取的最後一個星期六的數據。

我不想使用這個硬編碼的值。我需要一些Oracle的內置函數來自動執行從數據庫獲取上週六數據的過程。

+0

你的問題不清楚。 –

+1

sysdate和next_day已經是日期,所以不需要TO_DATE(...,'DD-MON-YY') –

+0

重新構造問題 我有下面的Oracle SQL查詢。 從pr_tab中選擇p_name,cal_vale,l_date,其中 L_date = to_date('03 -sep-16','dd-mon-yy'); 這裏是2006年9月3日的硬編碼日期值,用於從數據庫捕獲上週六的數據。 我不想使用這個硬編碼值,而是希望使用一些Oracle SQL函數,它可以自動執行從數據庫捕獲上週六數據的這一過程。 – user1917985

回答

1

從日期格式說明符'D'開始,該日期格式說明符指定星期幾,介於1和7之間。一個問題是Oracle返回的內容取決於NLS_TERRITORY設置,因此它可能是星期日,星期一(或者我認爲的星期六)。

假設值1代表星期天,就像它在北美一樣。

例如,在星期四,TO_NUMBER(TO_CHAR(SYSDATE, 'd'))返回5

sysdate - to_number(to_char(sysdate, 'D'))回報上週六的日期爲每週的任何一天。

根據NLS_TERRITORY設置,這僅適用於星期的第一天(1)是星期日的情況。

例如,如果1代表星期一,那麼上週六是sysdate - to_number(to_char(sysdate, 'D'))-1

更好的方法是硬編碼在查詢中NLS_DATE_LANGUAGE設置,並得到日從當天偏移:

select case to_char (sysdate, 'FmDay', 'nls_date_language=english') 
      when 'Monday' then 2 
      when 'Tuesday' then 3 
      when 'Wednesday' then 4 
      when 'Thursday' then 5 
      when 'Friday' then 6 
      when 'Saturday' then 7 
      when 'Sunday' then 1 
     end d 
    from dual 

所以

sysdate -case to_char (sysdate, 'FmDay', 'nls_date_language=english') 
       when 'Monday' then 2 
       when 'Tuesday' then 3 
       when 'Wednesday' then 4 
       when 'Thursday' then 5 
       when 'Friday' then 6 
       when 'Saturday' then 7 
       when 'Sunday' then 1 
      end 

可靠地爲您提供了上週六的日期無論NLS設置如何,一週中的任何一天。

+0

謝謝託尼的幫助。讓我試試這個 – user1917985

+0

沒問題,確保批准答案時,它的工作。 –

+0

嗨託尼,它工作在我的查詢獲取上週六的數據:)再次感謝您的幫助 – user1917985

2

可以使用功能NEXT_DAY()

SELECT NEXT_DAY(TRUNC(SYSDATE) - INTERVAL '8' DAY, 'SATURDAY') 
FROM DUAL; 

(注:你需要從8天找到下週六前,因爲,如果今天是星期六,那麼如果你從7天找到了下週六以前你會回到今天。)

+0

感謝您的response.SELECT next_day((sysdate)-7,'SAT')FROM DUAL;也適用於我。 – user1917985

+0

@ user1917985如果今天是星期六,那麼'NEXT_DAY(SYSDATE - 7,'SATURDAY')'今天不會返回上週六。 – MT0

相關問題