2018年1月2日 星期二

如何取得本月第三個週三 (期貨轉倉日)

每月的第三個週三為期貨轉倉日,以下範例將進行說明,將使用以下二個重要概念:
1.   取得下一個週三
請注意下週三下一個週三意義不同,如今天為週二,則下週三為第8天,而下一個週三則為次日。ORACLE可直接使用NEXT_DAY函數,MSSQL無對應函數,但可使用計算方式求得。

2.   使用上個月底日為基準日
本月第三個週三,如使用本月初為基準日,需額外判斷月初是否符合第一個週三等煩雜運算邏輯,如使用上個月月底日,即可完全省略此判斷式(重點)。

DB
SQL
ORACLE
SELECT NEXT_DAY(TRUNC(DATE'2018-01-02', 'MM')-1, 4) + 2*"第三個週三"
FROM DUAL

上個月月底TRUNC(DATE'2018-01-02''MM')-1
下一個週三: NEXT_DAY({DATE}, 4)
MSSQL
SELECT Tgt
  , CONVERT(CHAR(10)
      , Tgt + (7- DATEPART(DW, Tgt) + 3)%7+1
      , 120) "下一個週三"
  , DATEADD(DD, -1, CONVERT(CHAR(8), Tgt, 120)+'01')  "上個月底日"   
  , DATEADD(DD, -1, CONVERT(CHAR(8), Tgt, 120)+'01')        
      + (7
         - DATEPART(DW
            , DATEADD(DD, -1, CONVERT(CHAR(8), Tgt, 120)+'01')) + 3)%+1
    2*"第三個週三"
FROM
   (
   SELECT CAST('2018-01-02' AS DATETIME) Tgt
   --UNION ALL

   --SELECT CAST('2018-03-30' AS DATETIME)
   ) A

上個月月底DATEADD(DD, -1, CONVERT(CHAR(8), Tgt, 120)+'01')
下一個週三: Tgt + (7- DATEPART(DW, Tgt) + 3)%+1

沒有留言:

張貼留言