我正在嘗試進行查詢,其中對于每個作業日,它總是選擇最后一個作業日,星期一除外。在星期一,它應該總是選擇最后一個星期五。
為此,可以通過選擇或創建允許識別這些情況的附加列來完成。
例子:
- 如果 first_date = 星期二,則選擇星期一
- 如果 first_date = Thursday 然后選擇星期三
- 如果 first_date = Monday 然后選擇 Friday
這是我的查詢:
SELECT name,
first_date,
last_day,
product,
TO_DATE(first_date) - TO_DATE(last_day) AS d,
CASE WHEN TO_CHAR(first_date, 'D') = '7' THEN -2
WHEN TO_CHAR(first_date, 'D') = '6' THEN -1
ELSE 0
END
FROM t1.mydata
WHERE d > 50
關于如何做到最好的任何想法?
uj5u.com熱心網友回復:
您可以將條件TO_CHAR轉換與Dy(or Day) 引數一起使用,而不是使用那些整數表示,對于某些區域,這些可能會在作業日失敗,例如
SELECT CASE WHEN TO_CHAR(your_datecol,'Dy','NLS_DATE_LANGUAGE=English') ='Mon' THEN
'Fri'
WHEN TO_CHAR(your_datecol,'Dy','NLS_DATE_LANGUAGE=English') = 'Sun' THEN
Null
ELSE
TO_CHAR(your_datecol-1,'Dy','NLS_DATE_LANGUAGE=English')
END AS last_business_day
FROM your_table
無視當地的職位空缺。
uj5u.com熱心網友回復:
您可以使用TRUNC(first_date) - TRUNC(fisrt_date, 'IW')將日期(截斷為午夜)與 ISO 周的開始時間(始終為星期一的午夜)進行比較。無論NLS_DATE_LANGUAGE或NLS_TERRITORY設定如何,這都將起作用。
SELECT name,
first_date,
last_day,
product,
last_day - first_date AS d,
first_date
- CASE TRUNC(first_date) - TRUNC(fisrt_date, 'IW')
WHEN 0 THEN -3 -- Monday
WHEN 6 THEN -2 -- Sunday
ELSE -1 -- Other days
END AS prev_business_day
FROM t1.mydata
WHERE last_day - first_date > 50
注意:如果您使用TO_CHAR(first_date, 'D')then 如果當天是星期一,那么它將回傳:1在歐洲大部分地區;2在美國; 3在一些中東國家;在孟加拉國,4他們都認為一周的第一天是不同的一天db<>fiddle。這是基于NLS_TERRITORY設定的,不能在查詢中覆寫。
注意:如果您使用TO_CHAR(first_date, 'Dy'),那么它將使用NLS_DATE_LANGUAGEsession 引數來設定日期語言,因此您的查詢只能以一種語言作業。您需要指定第三個引數(即TO_CHAR(first_date, 'Dy', 'NLS_DATE_LANGUAGE=English'))以使其在國際環境中始終如一地作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490002.html
上一篇:'%'表示任何字符,是否只有一個字符有任何特殊字符?
下一篇:格式選擇plsql中的輸出資訊
