2018年3月18日 星期日

取得下一個週五的日期

首先探討「下週五」和「下一個週五」定義上的差別。假設今天為03-24日(一),「下週五」為04-04,此為一般所周知且常使用的定義,無需多做解釋;在將介紹「下一個週五」,即晚(大)於現在但最近(小)的週五,以03-24日(一)的下一個週五是03-28(五),此常用於以週為單位的生產、營運績效彙總報表,或者期貨轉倉日(每月第三個週三),在此將說明的如何取得此一日期。
名詞
定義
日期
下一個週五
大(晚)於今天(03-24),最近的週五。
績效計算用。
03-28
下週五
下週五是以一週的起始來區分。
一般習慣用法。
04-04
假設今天為2014-03-24(一)


ORALE提供NEXT_DAY函數可直接取得下一個星期幾的日期函數。語法如下:
NEXT_DAY(date, day_of_the_week)
1個參數:目標日期
2個參數:指定週幾(星期一、二),可指定文字型態星期幾(語系參考NLS設定)或數字(1~7,星期天為1

MSSQL並無對指令,但可使用以下運算式取代。

SQL及執行結果如下。
資料庫
SQL / Result
ORACLE
SELECT Target
  , TO_CHAR(Target, 'DAY') "星期幾"
  , NEXT_DAY(Target, 6)    "下個週五"
FROM
   (
   SELECT DATE'2014-03-24' + (LEVEL-1) Target
   FROM DUAL
   CONNECT BY LEVEL<=10
   )

MSSQL
SELECT S.Target
  , DATENAME(WEEKDAY, S.Target) "星期幾"
  , S.Target +(7-DATEPART(DW, S.Target)+ 5)%7 +1 "下個週五"
FROM
    (
     SELECT DATEADD(dd, number, '2014-03-24') Target
     FROM master.dbo.spt_values
     WHERE 1=1
         AND type ='P'
         AND number <=9
   ) S

1 則留言:

  1. 下個週五的取得 → S.Target + 7 - (DATEPART(DW,S.Target) + 1) % 7
    可比原來減少一個運算!

    回覆刪除