DATEDIF 函式

依據指定測量單位計算兩個有效日期值之間的差異。
  • 輸入內容必須為資料欄參照。
  • 第一個值會用做日期值的比較基準。
  • 計算結果為最接近且小於實際總數的整數值,剩餘的小數值會遭捨棄。

基本用法

derive type:single value:DATEDIF(StartDate, EndDate, month)

輸出:產生一個資料欄,其值為計算 StartDateEndDate 之間經過的完整月份數。

語法

derive type:single value:DATEDIF(date1,date2,date_units )

引數是否必要?資料類型說明
date1日期時間要用於比較的開始日期
date2日期時間要用於比較的結束日期
date_units字串字串常值,代表比較時使用的日期單位

如要進一步瞭解語法標準,請參閱語言文件語法附註

date1、date2

要使用 date_units 單位比較的日期值。如果 date2 > date1,則結果為正數。

  • 日期值必須為資料欄參照。
  • 如果 date1date2 有特定時區偏移,DATEDIF 在計算相差天數時會將時區偏移納入計算。
  • 如果 date1 沒有特定時區偏移,但 date2 有,DATEDIF 會使用 date2 時區的當地時間計算相差天數。DATEDIF 傳回的相差天數不含時區偏移。

使用須知:

是否必要?資料類型示例值
字串 (日期資料欄參照)LastContactDate

date_units

計算兩個有效值之間的相差天數時使用的日期測量單位。

使用須知:

是否必要?資料類型示例值
字串year

可接受的日期單位值:

  • year
  • quarter
  • month
  • dayofyear

  • week
  • day
  • hour
  • minute
  • second
  • millisecond

範例

範例 - 已存在一定時間的訂單

這個範例說明如何使用 DATEDIF 函式計算從訂單日期到今天為止經過的天數,以便通知客戶。

來源:

假設您想要對下列資料集中存在時間超過 90 天的訂單收取利息。

OrderIdOrderDateAmount
10011/31/161000
100211/15/151000
100312/18/151000
10041/15/161000

轉換:

第一個步驟是建立含有今天 (3/16/16) 日期值的資料欄:

derive type:single value:TODAY() as:'Today'

您現在可以使用這個值做為基礎,針對每張月結單計算經過的天數:

derive type:single value:DATEDIF(OrderDate, Today, day)

每張月結單的存在時間長度會顯示在新資料欄中,單位為天數。現在,假設您想在這項比較中加入一些資訊。您可以寫出要採取的動作,而不只是計算天數。請使用下列指令取代上述指令:

derive type:single value:IF((DATEDIF(OrderDate, Today, day) > 90),'Charge interest','no action') as:'TakeAction'

為了公平對待客戶,您可能會想在月結單仍未結清的第 45 天發出通知。您可以使用下列指令來取代上述指令:

derive type:single value:IF(DATEDIF(OrderDate, Today, day) > 90,'Charge interest',IF(DATEDIF(OrderDate, Today, day) > 45),'Send letter','no action')) as: 'TakeAction'

只要使用 IF 函式的巢狀例項,您就能在 TakeAction 資料欄中產生多個結果。

如果您想針對存在時間超過 90 天的項目收取 5% 的利息,則可以執行下列指令:

set col:Amount value:IF(TakeAction == 'Charge interest',Amount * 1.05,Amount)

上述指令會依據 TakeAction 資料欄值是否為 Charge interest 的條件,設定 Amount 資料欄中的值。如果是要收取利息,則對 Amount 資料欄中的值套用 5% 利息費用。

結果:

OrderIdOrderDateAmountTodayTakeAction
10011/31/16100003/03/16no action
100211/15/15105003/03/16Charge interest
100312/18/15100003/03/16Send letter
10041/15/16100003/03/16Send letter

範例 - dayofyear 計算

這個範例說明如何使用 DATEDIF 函式計算 dayofyear,尤其是處理閏年和閏日的方式。以下提供一些日期範例。2012 年是閏年。

來源:

dateIdd1d2附註
11/1/1010/10/10同一年;非閏年
21/1/1010/10/11不同年;非閏年
310/10/111/1/10與前一資料列的日期相反
42/28/114/1/11同一年;非閏年
52/28/124/1/12同一年;閏年;涵蓋閏日
62/29/124/1/12同一年;閏年;d1 是閏日
72/28/112/29/12不同年;d2 是閏日;轉換成 d1 年份的 3 月 1 日

轉換:

在這種情況下,轉換很簡單:

derive type:single value:DATEDIF(d1,d2,dayofyear) as:'datedifs'

結果:

dateIdd1d2datedifs附註
11/1/1010/10/10282同一年;非閏年
21/1/1010/10/11282不同年;非閏年
310/10/111/1/10-282與前一資料列的日期相反
42/28/114/1/1132同一年;非閏年
52/28/124/1/1233同一年;閏年;涵蓋閏日
62/29/124/1/1232同一年;閏年;d1 是閏日
72/28/112/29/121不同年;d2 是閏日;轉換成 d1 年份的 3 月 1 日

第 1 到 3 列:

  • 第 1 列提供基準計算結果。
  • 第 2 列使用了相同日期,但差了 1 年。不過,由於計算的是 dayofyear,因此結果與第 1 列相同。

    附註:計算 dayofyear 時,d2 的年份值會轉換成 d1 的年份。然後再計算相差天數。

  • 第 3 列的日期與第 2 列的日期相反。

    附註:如果 dayofyear 計算結果為負數值,表示 d2 的發生時間早於 d1 (忽略年份)。

第 4 到 7 列:閏年

  • 第 4 列提供非閏年的基準計算結果。
  • 第 5 列與第 4 列的日期相同,但第 5 列的年份 (2012 年) 是閏年,且日期涵蓋閏日 (2 月 29 日)。您可看出第 5 列的 DATEDIF 結果比前一列的值大 1。

    附註:如果兩個日期之間涵蓋閏日,且 d1 的年份是閏年,則計算結果會包含 2 月 29 日。

  • 第 6 列的日期 1 提早了一天,因此變成閏日。計算結果比前一列少了 1,這兩列都涵蓋閏日。
  • 第 7 列的閏日落在 d2。在此情況下,系統會將 d2 轉換成 d1 的年份。不過,由於該日期原本是閏日,因此在 d1 的年份中,這個值會變成 3 月 1 日,而兩個日期之間的相差天數為 1

    附註:如果 d2 是閏日,且 d1 的年份不是閏年,則 d2 使用的日期為 d1 年份的 3 月 1 日。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Google Cloud Dataprep 說明文件
需要協助嗎?請前往我們的支援網頁