每月的第三個週三為期貨轉倉日,以下範例將進行說明,將使用以下二個重要概念:
1.
取得下一個週三
請注意下週三與下一個週三意義不同,如今天為週二,則下週三為第8天,而下一個週三則為次日。ORACLE可直接使用NEXT_DAY函數,MSSQL無對應函數,但可使用計算方式求得。
2.
使用上個月底日為基準日
本月第三個週三,如使用本月初為基準日,需額外判斷月初是否符合第一個週三等煩雜運算邏輯,如使用上個月月底日,即可完全省略此判斷式(重點)。
DB
|
SQL
|
ORACLE
|
SELECT NEXT_DAY(TRUNC(DATE'2018-01-02', 'MM')-1, 4) + 2*7 "第三個週三"
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)%7
+ 2*7 "第三個週三"
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)%7
|
沒有留言:
張貼留言