從日期格式說明符'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設置如何,一週中的任何一天。
你的問題不清楚。 –
sysdate和next_day已經是日期,所以不需要TO_DATE(...,'DD-MON-YY') –
重新構造問題 我有下面的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