我有一張表,我想在最近的星期五之前提取所有日期記錄。我知道您可以使用 sysdate(或 getdate)來獲取當前日期,但是我查看過的類似問題的所有解決方案都明確指定了查詢中的星期幾。今天星期四,所以下面會起作用,但是有沒有動態的替代方案?
SELECT *
FROM table
WHERE datefield < sysdate - 6
uj5u.com熱心網友回復:
next_day 功能可能會有所幫助。
SQL> with test (datum) as
2 -- sample data; this January up to today
3 (select trunc(sysdate, 'mm') level - 1
4 from dual
5 connect by level <= 20
6 )
7 select to_char(datum, 'dd.mm.yyyy, dy') datum
8 from test
9 where datum < next_day(sysdate - 7, 'FRIDAY')
10 order by datum;
DATUM
------------------------
01.01.2022, sat
02.01.2022, sun
03.01.2022, mon
04.01.2022, tue
05.01.2022, wed
06.01.2022, thu
07.01.2022, fri
08.01.2022, sat
09.01.2022, sun
10.01.2022, mon
11.01.2022, tue
12.01.2022, wed
13.01.2022, thu
14.01.2022, fri
14 rows selected.
SQL>
uj5u.com熱心網友回復:
你可以使用:
SELECT NEXT_DAY(TRUNC(SYSDATE) - 7, 'FRIDAY') AS last_friday
FROM DUAL;
但是,如果有人嘗試查詢資料并使用不同的語言,那么您將收到錯誤訊息。IE:
ALTER SESSION SET NLS_DATE_LANGUAGE = 'FRENCH';
SELECT NEXT_DAY(TRUNC(SYSDATE) - 7, 'FRIDAY') AS last_friday
FROM DUAL;
輸出:
ORA-01846: not a valid day of the week
無論使用哪種語言,一個可行的解決方案是將這一天與 ISO 周的開始(始終是星期一)進行比較:
SELECT TRUNC(SYSDATE, 'IW')
CASE WHEN SYSDATE - TRUNC(SYSDATE, 'IW') < 5
THEN -3
ELSE 4
END AS last_friday
FROM DUAL;
輸出(NLS_DATE_FORMAT設定為YYYY-MM-DD HH24:MI:SS (DY)):
上周五 2022-01-14 00:00:00 (周五)
db<>在這里擺弄
您的查詢將是:
SELECT *
FROM table
WHERE datefield < TRUNC(SYSDATE, 'IW')
CASE WHEN SYSDATE - TRUNC(SYSDATE, 'IW') < 5
THEN -3
ELSE 4
END
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417569.html
標籤:
上一篇:SQL:選擇值不屬于某一列的記錄
下一篇:提取具有重復ID的表中的最新記錄
