2017年1月6日 星期五

[程式類]PLSQL查詢工作日; plsql how to get business days

若在PLSQL想要查詢所傳日期參數月的所有工作天,則使用以下方法達成

WITH ALLWorkDate as
(
    select allday workday from (
        select allday from (
            select to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd')+rownum-1 allday
            from
                (select to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd'),to_date(add_months(to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd'),'yyyy-mm-dd'),1) from dual)
            connect by rownum <= add_months(to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd'),1)-to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd')
        ) where 1=1
            and to_char(allday,'D') >1
            and to_char(allday,'D') <7
            and allday not in (select Holiday from EBHoliday where to_char(Holiday,'yyyy-mm') = to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm'))
        order by allday desc
    )aa
),LastWorkDate as
(
    select workday
    from ALLWorkDate
    where rownum = 1
),Last2WorkDates as
(
    select workday
    from ALLWorkDate
    where rownum <= 2
)

其中ALLWorkDate會將所有該月的日期撈出,再去掉在'假日檔'裡的日期;
我遇到的題目是最後一個工作日, 及最後兩個工作日..
所以利用反向排序後, 再用rownum指定是一筆, 還是兩筆...

[程式類]-PLSQL(oracle)中字字碼RDAP 字數算錯

在PLSQL 若採用RDAP 想輸出固定字數的字元時我們通常採用;

LDAP(Col, 10, ' ')

Col指的是欄位,
10表示固定10碼
' '表示要填不足碼的值
LDAP指左補' ',表示此欄位靠右;RDAP則反之

但是若Col裡的值是中文字時, 這時就要注意"難字"的問題

例:

LDAP('這是測式堃',10,' ')

這時它會誤判堃這個字,會造成所要的結果和你想的不一樣,

中文若要輸出固字的字數,則要使用DECode方法來避免這個問題產生

RPAD(DECODE('這是測式堃', NULL, ' ' , '這是測式堃'), 10, ' ')

POSTGRE SQL 想使用變數去定義一段日期區間, 但遍尋不到像是在 MSSQL 時常用的 DECLARE @count int, @x int, @y nvarchar(10)... 想到一招利用 CTE 方式去定義一個這樣類似變數的作法來實現... 原來的script w...