SPL 的日期時間函式

嘟嘟是隻喵發表於2019-08-07

在資料分析計算中,日期時間類資料是比較特殊的型別,這裡我們就來研究一下如何在SPL中使用日期時間類資料。

1日期時間資料的轉換和生成

日期時間類資料,通常會用字串來輸入或顯示。在使用集算器時,可以點選Tool>Option,在選項配置的Environment頁面中,設定日期時間型別資料所使用的預設格式,如:

SPL 的日期時間函式

使用SPL時,日期時間型別的資料會按照預設的格式顯示出來,如:

image.png  

執行後檢視A1中的結果如下:

SPL 的日期時間函式

這裡用到的函式now() 是日期時間計算中比較常用的函式,可以獲得系統中當前的日期時間。日期時間的顯示在不同的語言環境中是不同的,特別是月份和星期等資料,下面都將以英文版的格式為例加以說明。

當需要輸入日期時間型別的常數時,也可以直接按照格式輸入字串,此時SPL會自動將資料解析為日期時間資料,如:

image.png  

A1,B1和C1會分別被解析為日期型別、日期時間型別和時間型別資料,如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

SPL可以把直接輸入的常數解析為日期時間型別,但對於已經是字串型別的,就需要用date(),time() 或者datetime() 將字串轉換為日期、時間或者日期時間資料,如:

image.png  

A2,B2和C2中是通過字串運算得到的字串:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

第3行用ifdate() 和iftime() 函式判斷第2行的資料是否已被處理為日期或者時間型別(注意:判斷日期型別和日期時間型別的資料,都使用ifdate()),A3,B3和C3中的結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

從結果可以看出,第2行中單元格值都不是日期或時間類資料,實際上都是字串,顯示也都和日期時間不同。

在第4行中,將字串按照對應的格式分別轉換為日期時間資料,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

在第5行判斷第4行的資料是否已被處理為日期或者時間型別,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

 

當使用外部資料時,有時需要處理不同格式的日期時間資料,這時可以在使用date(),time() 或者datetime() 時,在字串後新增使用的顯示格式串,如:

image.png  

在第1行中的資料都並沒有用預設的日期時間格式,而且B1和C1都在前面新增了 ' 字元表示使用字串常數,A1,B1和C1中的資料如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

需要注意的是,月份格式MMM的設定是和語言環境相關的,英文環境中表示月份的英文縮寫,如Feb;而中文環境中則會顯示為中文月份。

第2行中列出的格式串指示SPL如何解析第1行中的資料,第3行使用這些格式串進行轉換,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

完成型別轉換後,檢視結果時仍然會用預設的格式顯示。如果要用其他格式顯示,可以用string( d , fmt )函式,將日期時間類資料轉換為指定格式的字串,如:

image.png  

A3,B3和C3中,將日期時間類資料轉換為指定格式的字串:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

當然,也可以根據需要直接修改預設的日期時間顯示格式。

 

在用date(),time() 或者datetime() 生成資料型別時,還可以直接依次指定年,月,日,時,分,秒等各個分量:

image.png  

結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

在指定各個分量時,要注意每個整數的合理範圍,例如小時分量在0~23之間。

2日期時間資料的顯示格式

image.png  

這個例子中,A1中用date()生成日期,第一個引數使用了6位數,SPL將用其同時表示年和月。而C1則將A1中的日期和B1中的時間合併得到日期時間資料,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

上一節已經使用到了日期時間資料的一些顯示格式,用格式字串來指定顯示樣式,例如yyyy表示4位數的年份、dd表示2位數的日期等。下面將具體說明格式串中各個字元的作用,並以C1中的資料為例顯示相應的格式化結果:

image.png      

  image.png

3從日期時間資料中獲取資訊

在日期時間等型別的資料中,具體的年,月,日,時,分,秒等常常是處理時需要單獨使用的資訊,我們可以通過year(),month(),day(),hour(),minute(),second(),millisecond()等函式獲得這些日期時間資料中的各個分量:

image.png  

A1,B1和C1中的日期時間資料如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

A2,B2和C2從日期資料中分別獲取年、月、日:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

A3,B3和C3從時間資料中獲取時、分、秒:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

A4,B4和C4從now() 函式的日期時間型別結果中獲取月,小時和毫秒分量:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

從結果中可以看到,now() 函式返回的結果會精確到毫秒,但顯示時只會顯示到秒。在使用now() 函式時,可以通過新增選項的方法來改變結果的精度。如:

image.png  

A1中新增@d選項,只取日期部分資料,B1中新增@t選項,只取時間部分資料,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式

A2中新增@m選項,資料將精確到分,B2中新增@s選項,獲得的資料將精確到秒,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式

在C2中可以看到,B2中的資料毫秒分量為0:

SPL 的日期時間函式

@m和@s選項,也可以用在datetime() 和time() 函式中,設定轉換日期時間資料及時間資料時的精度為分或秒。

 

在日期型別資料中,也可以獲取到時間分量,從時間型別資料中也可以獲取日期分量,如:

image.png      

A2,B2和C2中結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

也就是說,單獨的日期資料,其中的時間指定為00:00:00。

A3中的month函式新增了@y選項,獲得年月組成的6位數,A3和B3中結果如下:

SPL 的日期時間函式 SPL 的日期時間函式

也就是說,單獨的時間資料,其中的日期為1970年1月1日。

 

除了直接從日期時間型別的資料中獲取各個分量,還有一些函式可以用來獲得日期相關的資料。

 

使用day@w(),在獲取日期分量時新增@w選項,可以獲得本日是一週中的第幾天:

image.png  

A2,B2和C2獲取各個日期分別是一週中的第幾天,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

SPL中,每週的第1天是從週日開始計算的,在第3行中用顯示字串的方式取得了每一天是星期幾:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

 

另外,我們還可以使用pdate() 函式,配合不同的選項獲得日期

image.png  

在pdate() 函式中:

○   直接使用@w選項可以獲得本週第1天的日期,從週日開始計算;

○   新增@m選項可以獲得本月第1天的日期;

○   新增@q選項可以獲得本季度第1天的日期;

○   新增@e則可以獲得某個時間段最後一天的資料,如本週最後一天,本季度最後一天等。A2,B2,C2,A3,B3和C3中的結果依次如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

 

SPL中還可以使用days() 函式計算某日期所在月的總天數,新增@q選項可以得到所在季度的總天數,新增@y選項可以得到整年的總天數,如:

image.png  

A2,B2和C2中的結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

4使用日期時間資料的計算

除了直接從日期時間資料中獲取資訊,在SPL中還可以使用日期時間類資料來執行各類計算。

最常用的有關日期的計算就是計算年齡:

image.png  

A1和B1中的資料如下:

SPL 的日期時間函式 SPL 的日期時間函式

在第2行用age() 函式,根據A1中的生日來計算年齡,計算年齡時,是以當前的日期為準的,預設情況將精確到日,新增@m可以將精度設為月,新增@y可以將精度設定為年。在不同精度的情況下,計算所得的年齡可能會有區別,A2,B2和C2中得到的年齡分別如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

 

使用age() 函式,類似於計算生日日期和當前日期間隔的年數。更普遍的計算時間間隔的函式是interval() 函式,用這個函式可以計算兩個日期時間資料之間相差多少天,新增@y,@q,@m,@s,@ms等選項,可以計算間隔多少年,季度,月,秒或毫秒。例如:

image.png  

如果只需要計算兩個日期之間相差多少天,也可以直接用減法完成,A2,B2和C2中的結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

特別的,每個日期時間資料都可以轉換為一個對應的長整數,這個長整數其實就是指定的日期時間和1970年1月1日,格林威治時間0:00:00的間隔毫秒數,如:

image.png  

而在B2中,用long() 函式直接將日期時間類資料轉換為長整數,可以看到A2和B2中的結果是相同的:

SPL 的日期時間函式 SPL 的日期時間函式

 

SPL中的elapse( t , k ) 函式,可以根據已有的日期時間 t ,計算 k 天后的結果。新增選項@y,可以計算 k 年後的日期時間。類似的,還可以新增@q,@m,@s,@ms等選項,將間隔單位設定為季度,月,秒或毫秒。如:

image.png  

A2,B2和C2中分別計算10天后,20年後和1個月前的日期,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

如果只是需要計算相差若干天的日期,也可以直接簡寫為加減法,如=A1+10,=A1-10等。

由於每個月的天數不同,在計算 k 個月後的日期時,預設情況下還會考慮當前日期是否是該月的最後一天,並進行對應的調整,如果不需要這樣的調整,則需要新增@e選項,如:

image.png  

B1和C1中的結果如下:

SPL 的日期時間函式 SPL 的日期時間函式

可以看到,由於2020年2月29日是2月的最後一天,B1中計算3個月後的日期時,同樣得到了5月的最後一天,而C1中新增了@e選項,只計算3個月後的日期,而不做調整。

 

由於日期時間資料比較特殊,很多情況下並不方便直接判斷是否相等。為此,可以在SPL中使用deq() 函式,只要兩個資料在同一天,即認為相等。也可以新增選項@y,@q,@m@t@w等,將精度設為精確到年,季度,月,旬或周。如:

image.png  

A2,B2和C2中的判斷結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

 

在使用日期時間資料時,還有一類計算是有關工作日的計算,用workday( t , k , h ) 函式可以計算指定日期時間 t k 個工作日的日期時間,用workdays( b , e , h ) 可以計算開始日期 b 和結束日期 e 之間的工作日序列。有關工作日的計算比較複雜,正常的工作日是每週的週一到週五,但是有時會受公假的影響,週一到週五的某天是休息日,或者週末的某一天需要正常上班,這樣的日期調整可以設定到序列 h 中,序列中的非週末日期是增加的假期,序列中的週末日期則是需要加班的工作日。如:

image.png  

A2中設定了2019年五一勞動節的公共假期調休情況:5月1日至5月3日的原工作日放假,而4月28日及5月5日的原週末調整為工作日。A3中計算結果如下:

SPL 的日期時間函式

注意2019年5月1日至3日為勞動節假期,5月4日為週末,而5月5日的原週末調整為工作日,因此2019年4月30日後的第2個工作日是2019年5月6日。

B3和C3中的結果如下:

SPL 的日期時間函式 SPL 的日期時間函式

可以看到,在未指定調整日期序列的情況下,只會顯示週一到週五的日期;而A3中返回的結果才是正確的工作日。

 

用workdays() 可以得到工作日序列,更通用的計算日期時間序列的函式是periods( s , e , i ),用來計算開始日期時間 b 和結束日期時間 e 之間的日期時間序列,間隔為 i 天。通過新增函式選項@y,@q,@m,@t,@s,可以調整時間間隔的單位為年,季度,月,旬或秒。如果不希望設定的結束值在結果中出現,則可以新增@x選項。在時間序列中,出現的每個資料都會調整為指定時間段的第1天,如每月第1天,每年第1天等,如果不需要這種調整,可以新增@o選項。如:

image.png  

A2,B2中結果如下:

SPL 的日期時間函式 SPL 的日期時間函式

其中,A2中間隔單位為日,B2中間隔單位為月。

A3中設定去除結束日期,B3中設定不調整日期到月初,C3中同時設定@o和@x選項,結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

 

有時需要將一段時間等分,此時可以使用range() 函式,如:

image.png  

A2中,將2019年1月1日至2020年1月1日平均分為4段,取出第1段的起止日期;B2中取出第3段的起止日期。C2中將獲取平均分為4段時,包括起止時間的每個間隔日期。A2,B2和C2中結果如下:

SPL 的日期時間函式 SPL 的日期時間函式 SPL 的日期時間函式

使用range函式時,如果前兩個引數為日期時間,則分段時將精確到日;如果前兩個引數為日期時間,則將精確到秒。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543054/viewspace-2652923/,如需轉載,請註明出處,否則將追究法律責任。

相關文章