小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SPL 的日期時(shí)間函數(shù)

 raqsoft 2019-08-06

在數(shù)據(jù)分析計(jì)算中,日期時(shí)間類數(shù)據(jù)是比較特殊的類型,這里我們就來研究一下如何在SPL中使用日期時(shí)間類數(shù)據(jù)。

1日期時(shí)間數(shù)據(jù)的轉(zhuǎn)換和生成

日期時(shí)間類數(shù)據(jù),通常會(huì)用字符串來輸入或顯示。在使用集算器時(shí),可以點(diǎn)擊Tool>Option,在選項(xiàng)配置的Environment頁面中,設(shè)定日期時(shí)間類型數(shù)據(jù)所使用的默認(rèn)格式,如:

使用SPL時(shí),日期時(shí)間類型的數(shù)據(jù)會(huì)按照默認(rèn)的格式顯示出來,如:


A
1 =now()

運(yùn)行后查看A1中的結(jié)果如下:

這里用到的函數(shù)now() 是日期時(shí)間計(jì)算中比較常用的函數(shù),可以獲得系統(tǒng)中當(dāng)前的日期時(shí)間。日期時(shí)間的顯示在不同的語言環(huán)境中是不同的,特別是月份和星期等數(shù)據(jù),下面都將以英文版的格式為例加以說明。

當(dāng)需要輸入日期時(shí)間類型的常數(shù)時(shí),也可以直接按照格式輸入字符串,此時(shí)SPL會(huì)自動(dòng)將數(shù)據(jù)解析為日期時(shí)間數(shù)據(jù),如:


A B C
1 2019-2-1 12:45:30 2019-02-01 10:30:00

A1,B1和C1會(huì)分別被解析為日期類型、日期時(shí)間類型和時(shí)間類型數(shù)據(jù),如下:

SPL可以把直接輸入的常數(shù)解析為日期時(shí)間類型,但對于已經(jīng)是字符串類型的,就需要用date(),time() 或者datetime() 將字符串轉(zhuǎn)換為日期、時(shí)間或者日期時(shí)間數(shù)據(jù),如:


A B C
1 2019 2 20
2 =A1/"-"/B1/"-"/C1 =12/":"/22/":00" =A2+" "+B2
3 =ifdate(A2) =iftime(B2) =ifdate(C2)
4 =date(A2) =time(B2) =datetime(C2)
5 =ifdate(A4) =iftime(B4) =ifdate(C4)

A2,B2和C2中是通過字符串運(yùn)算得到的字符串:

第3行用ifdate() 和iftime() 函數(shù)判斷第2行的數(shù)據(jù)是否已被處理為日期或者時(shí)間類型(注意:判斷日期類型和日期時(shí)間類型的數(shù)據(jù),都使用ifdate()),A3,B3和C3中的結(jié)果如下:

從結(jié)果可以看出,第2行中單元格值都不是日期或時(shí)間類數(shù)據(jù),實(shí)際上都是字符串,顯示也都和日期時(shí)間不同。

在第4行中,將字符串按照對應(yīng)的格式分別轉(zhuǎn)換為日期時(shí)間數(shù)據(jù),結(jié)果如下:

在第5行判斷第4行的數(shù)據(jù)是否已被處理為日期或者時(shí)間類型,結(jié)果如下:

 

當(dāng)使用外部數(shù)據(jù)時(shí),有時(shí)需要處理不同格式的日期時(shí)間數(shù)據(jù),這時(shí)可以在使用date(),time() 或者datetime() 時(shí),在字符串后添加使用的顯示格式串,如:


A B C
1 Feb 2, 2019 '2:30:45 PM '2019-6-20 2:30:45 PM
2 MMM d,yyyy h?s a yyyy-M-d h?s a
3 =date(A1,A2) =time(B1,B2) =datetime(C1,C2)

在第1行中的數(shù)據(jù)都并沒有用默認(rèn)的日期時(shí)間格式,而且B1和C1都在前面添加了 ' 字符表示使用字符串常數(shù),A1,B1和C1中的數(shù)據(jù)如下:

需要注意的是,月份格式MMM的設(shè)定是和語言環(huán)境相關(guān)的,英文環(huán)境中表示月份的英文縮寫,如Feb;而中文環(huán)境中則會(huì)顯示為中文月份。

第2行中列出的格式串指示SPL如何解析第1行中的數(shù)據(jù),第3行使用這些格式串進(jìn)行轉(zhuǎn)換,結(jié)果如下:

完成類型轉(zhuǎn)換后,查看結(jié)果時(shí)仍然會(huì)用默認(rèn)的格式顯示。如果要用其他格式顯示,可以用string(d,fmt)函數(shù),將日期時(shí)間類數(shù)據(jù)轉(zhuǎn)換為指定格式的字符串,如:


A B C
1 2019-02-21 12:45:30 2019-12-01 10:30:00
2 MMMM d,yyyy h?s a MMM d,yyyy h?s a
3 =string(A1,A2) =string(B1,B2) =string(C1,C2)

A3,B3和C3中,將日期時(shí)間類數(shù)據(jù)轉(zhuǎn)換為指定格式的字符串:

當(dāng)然,也可以根據(jù)需要直接修改默認(rèn)的日期時(shí)間顯示格式。

 

在用date(),time() 或者datetime() 生成數(shù)據(jù)類型時(shí),還可以直接依次指定年,月,日,時(shí),分,秒等各個(gè)分量:


A B C
1 =date(2019,2,21) =time(13,5,0) =datetime(2019,12,29,13,5,0)

結(jié)果如下:

在指定各個(gè)分量時(shí),要注意每個(gè)整數(shù)的合理范圍,例如小時(shí)分量在0~23之間。

2日期時(shí)間數(shù)據(jù)的顯示格式


A B C
1 =date(201906,29) =time(13:5:18) =datetime(A1,B1)

這個(gè)例子中,A1中用date()生成日期,第一個(gè)參數(shù)使用了6位數(shù),SPL將用其同時(shí)表示年和月。而C1則將A1中的日期和B1中的時(shí)間合并得到日期時(shí)間數(shù)據(jù),結(jié)果如下:

上一節(jié)已經(jīng)使用到了日期時(shí)間數(shù)據(jù)的一些顯示格式,用格式字符串來指定顯示樣式,例如yyyy表示4位數(shù)的年份、dd表示2位數(shù)的日期等。下面將具體說明格式串中各個(gè)字符的作用,并以C1中的數(shù)據(jù)為例顯示相應(yīng)的格式化結(jié)果:

字符 作用 SPL 結(jié)果
y/yy 年,兩位數(shù)字 =string(C1,"yy")
yyyy 年,四位數(shù)字 =string(C1,"yyyy")
M =string(C1,"M")
MM月,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"MM")
MMM 月,英文簡寫 =string(C1,"MMM")
MMMM 月,英文全拼 =string(C1,"MMMM")


d =string(C1,"d")
dd日,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"dd")
E 星期,英文簡寫 =string(C1,"E")
EEEE 星期,英文全拼 =string(C1,"EEEE")
G Era標(biāo)識(shí)符,公元前/公元后,縮寫 =string(C1,"G")


w 本年的第幾周 =string(C1,"w")
ww本年的第幾周,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"ww")
W 本月的第幾周 =string(C1,"W")
F 在本月的第幾周,僅根據(jù)日計(jì)算 =string(C1,"F")
D 本年的第幾天 =string(C1,"D")
H小時(shí),24小時(shí)制,0~23 =string(C1,"H")
HH小時(shí),24小時(shí)制,0~23,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"HH")
k小時(shí),24小時(shí)制,1~24 =string(C1,"k")
kk小時(shí),24小時(shí)制,1~24,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"kk")
h小時(shí),12小時(shí)制,1~12 =string(C1,"h")
hh小時(shí),12小時(shí)制,1~12,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"hh")
K小時(shí),12小時(shí)制,0~11 =string(C1,"K")
KK小時(shí),12小時(shí)制,0~11,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"KK")
m 分鐘 =string(C1,"m")
mm分鐘,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"mm")
s =string(C1,"s")
ss秒,兩位數(shù)字,不足用0補(bǔ)齊 =string(C1,"ss")
S 毫秒 =string(C1,"S")
a上午/下午 =string(C1,"a")
z 時(shí)區(qū),縮寫 =string(C1,"z")
zzzz 時(shí)區(qū),全拼 =string(C1,"zzzz")
Z 時(shí)區(qū)代碼 =string(C1,"Z")

 

3從日期時(shí)間數(shù)據(jù)中獲取信息

在日期時(shí)間等類型的數(shù)據(jù)中,具體的年,月,日,時(shí),分,秒等常常是處理時(shí)需要單獨(dú)使用的信息,我們可以通過year(),month(),day(),hour(),minute(),second(),millisecond()等函數(shù)獲得這些日期時(shí)間數(shù)據(jù)中的各個(gè)分量:


A B C
1 2019-6-30 12:45:30.230 =now()
2 =year(A1) =month(A1) =day(A1)
3 =hour(B1) =minute(B1) =second(B1)
4 =month(C1) =hour(C1) =millisecond(C1)

A1,B1和C1中的日期時(shí)間數(shù)據(jù)如下:

A2,B2和C2從日期數(shù)據(jù)中分別獲取年、月、日:

A3,B3和C3從時(shí)間數(shù)據(jù)中獲取時(shí)、分、秒:

A4,B4和C4從now() 函數(shù)的日期時(shí)間類型結(jié)果中獲取月,小時(shí)和毫秒分量:

從結(jié)果中可以看到,now() 函數(shù)返回的結(jié)果會(huì)精確到毫秒,但顯示時(shí)只會(huì)顯示到秒。在使用now() 函數(shù)時(shí),可以通過添加選項(xiàng)的方法來改變結(jié)果的精度。如:


A B C
1 =now@d() =now@t()
2 =now@m() =now@s() =millisecond(B2)

A1中添加@d選項(xiàng),只取日期部分?jǐn)?shù)據(jù),B1中添加@t選項(xiàng),只取時(shí)間部分?jǐn)?shù)據(jù),結(jié)果如下:

A2中添加@m選項(xiàng),數(shù)據(jù)將精確到分,B2中添加@s選項(xiàng),獲得的數(shù)據(jù)將精確到秒,結(jié)果如下:

在C2中可以看到,B2中的數(shù)據(jù)毫秒分量為0:

@m和@s選項(xiàng),也可以用在datetime() 和time() 函數(shù)中,設(shè)定轉(zhuǎn)換日期時(shí)間數(shù)據(jù)及時(shí)間數(shù)據(jù)時(shí)的精度為分或秒。

 

在日期類型數(shù)據(jù)中,也可以獲取到時(shí)間分量,從時(shí)間類型數(shù)據(jù)中也可以獲取日期分量,如:


A B C
1 2019-6-30 19:05:10.866
2 =hour(A1) =minute(A1) =second(A1)
3 =month@y(B1) =day(B1)

A2,B2和C2中結(jié)果如下:

也就是說,單獨(dú)的日期數(shù)據(jù),其中的時(shí)間指定為00:00:00。

A3中的month函數(shù)添加了@y選項(xiàng),獲得年月組成的6位數(shù),A3和B3中結(jié)果如下:

也就是說,單獨(dú)的時(shí)間數(shù)據(jù),其中的日期為1970年1月1日。

 

除了直接從日期時(shí)間類型的數(shù)據(jù)中獲取各個(gè)分量,還有一些函數(shù)可以用來獲得日期相關(guān)的數(shù)據(jù)。

 

使用day@w(),在獲取日期分量時(shí)添加@w選項(xiàng),可以獲得本日是一周中的第幾天:


A B C
1 2019-4-3 2019-6-18 2020-2-20
2 =day@w(A1) =day@w(B1) =day@w(C1)
3 =string(A1,"EEEE") =string(B1,"EEEE") =string(C1,"EEEE")

A2,B2和C2獲取各個(gè)日期分別是一周中的第幾天,結(jié)果如下:

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

 

另外,我們還可以使用pdate() 函數(shù),配合不同的選項(xiàng)獲得日期


A B C
1 2019-8-17

2 =pdate@w(A1) =pdate@m(A1) =pdate@q(A1)
3 =pdate@we(A1) =pdate@me(A1) =pdate@qe(A1)

在pdate() 函數(shù)中:

○   直接使用@w選項(xiàng)可以獲得本周第1天的日期,從周日開始計(jì)算;

○   添加@m選項(xiàng)可以獲得本月第1天的日期;

○   添加@q選項(xiàng)可以獲得本季度第1天的日期;

○   添加@e則可以獲得某個(gè)時(shí)間段最后一天的數(shù)據(jù),如本周最后一天,本季度最后一天等。A2,B2,C2,A3,B3和C3中的結(jié)果依次如下:

 

SPL中還可以使用days() 函數(shù)計(jì)算某日期所在月的總天數(shù),添加@q選項(xiàng)可以得到所在季度的總天數(shù),添加@y選項(xiàng)可以得到整年的總天數(shù),如:


A B C
1 2019-02-21

2 =days(A1) =days@q(A1) =days@y(A1)

A2,B2和C2中的結(jié)果如下:

4使用日期時(shí)間數(shù)據(jù)的計(jì)算

除了直接從日期時(shí)間數(shù)據(jù)中獲取信息,在SPL中還可以使用日期時(shí)間類數(shù)據(jù)來執(zhí)行各類計(jì)算。

最常用的有關(guān)日期的計(jì)算就是計(jì)算年齡:


A B C
1 1995-3-30 =now@d()
2 =age(A1) =age@m(A1) =age@y(A1)

A1和B1中的數(shù)據(jù)如下:

在第2行用age() 函數(shù),根據(jù)A1中的生日來計(jì)算年齡,計(jì)算年齡時(shí),是以當(dāng)前的日期為準(zhǔn)的,默認(rèn)情況將精確到日,添加@m可以將精度設(shè)為月,添加@y可以將精度設(shè)定為年。在不同精度的情況下,計(jì)算所得的年齡可能會(huì)有區(qū)別,A2,B2和C2中得到的年齡分別如下:

 

使用age() 函數(shù),類似于計(jì)算生日日期和當(dāng)前日期間隔的年數(shù)。更普遍的計(jì)算時(shí)間間隔的函數(shù)是interval() 函數(shù),用這個(gè)函數(shù)可以計(jì)算兩個(gè)日期時(shí)間數(shù)據(jù)之間相差多少天,添加@y,@q,@m,@s,@ms等選項(xiàng),可以計(jì)算間隔多少年,季度,月,秒或毫秒。例如:


A B C
1 1995-4-30 2019-4-10
2 =interval(A1,B1) =interval@y(A1,B1) =B1-A1

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

特別的,每個(gè)日期時(shí)間數(shù)據(jù)都可以轉(zhuǎn)換為一個(gè)對應(yīng)的長整數(shù),這個(gè)長整數(shù)其實(shí)就是指定的日期時(shí)間和1970年1月1日,格林威治時(shí)間0:00:00的間隔毫秒數(shù),如:


A B
1 =datetime("1/1/1970 0:00:00   GMT","m/d/yyyy H????ss z") 1995-4-30
2 =interval@ms(A1,B1) =long(B1)

而在B2中,用long() 函數(shù)直接將日期時(shí)間類數(shù)據(jù)轉(zhuǎn)換為長整數(shù),可以看到A2和B2中的結(jié)果是相同的:

 

SPL中的elapse(t,k) 函數(shù),可以根據(jù)已有的日期時(shí)間t,計(jì)算k天后的結(jié)果。添加選項(xiàng)@y,可以計(jì)算k年后的日期時(shí)間。類似的,還可以添加@q,@m,@s,@ms等選項(xiàng),將間隔單位設(shè)定為季度,月,秒或毫秒。如:


A B C
1 1995-4-30

2 =elapse(A1,10) =elapse@y(A1,20) =elapse@m(A1,-1)

A2,B2和C2中分別計(jì)算10天后,20年后和1個(gè)月前的日期,結(jié)果如下:

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

由于每個(gè)月的天數(shù)不同,在計(jì)算k個(gè)月后的日期時(shí),默認(rèn)情況下還會(huì)考慮當(dāng)前日期是否是該月的最后一天,并進(jìn)行對應(yīng)的調(diào)整,如果不需要這樣的調(diào)整,則需要添加@e選項(xiàng),如:


A B C
1 2020-2-29 =elapse@m(A1,3) =elapse@me(A1,3)

B1和C1中的結(jié)果如下:

可以看到,由于2020年2月29日是2月的最后一天,B1中計(jì)算3個(gè)月后的日期時(shí),同樣得到了5月的最后一天,而C1中添加了@e選項(xiàng),只計(jì)算3個(gè)月后的日期,而不做調(diào)整。

 

由于日期時(shí)間數(shù)據(jù)比較特殊,很多情況下并不方便直接判斷是否相等。為此,可以在SPL中使用deq() 函數(shù),只要兩個(gè)數(shù)據(jù)在同一天,即認(rèn)為相等。也可以添加選項(xiàng)@y,@q,@m@t@w等,將精度設(shè)為精確到年,季度,月,旬或周。如:


A B C
1 2019-2-15 12:33:00 2019-2-15 18:45:20 2019-2-28 10:05:00
2 =deq(A1,B1) =deq(A1,C1) =deq@m(A1,C1)

A2,B2和C2中的判斷結(jié)果如下:

 

在使用日期時(shí)間數(shù)據(jù)時(shí),還有一類計(jì)算是有關(guān)工作日的計(jì)算,用workday(t,k,h) 函數(shù)可以計(jì)算指定日期時(shí)間tk個(gè)工作日的日期時(shí)間,用workdays(b,e,h) 可以計(jì)算開始日期b和結(jié)束日期e之間的工作日序列。有關(guān)工作日的計(jì)算比較復(fù)雜,正常的工作日是每周的周一到周五,但是有時(shí)會(huì)受公假的影響,周一到周五的某天是休息日,或者周末的某一天需要正常上班,這樣的日期調(diào)整可以設(shè)置到序列h中,序列中的非周末日期是增加的假期,序列中的周末日期則是需要加班的工作日。如:


A B C
1 2019-4-30 2019-4-27 2019-5-5
2 [2019-5-1, 2019-5-2, 2019-5-3,   2019-4-28, 2019-5-5]

3 =workday(A1,2,A2) =workdays(B1,C1) =workdays(B1,C1,A2)

A2中設(shè)定了2019年五一勞動(dòng)節(jié)的公共假期調(diào)休情況:5月1日至5月3日的原工作日放假,而4月28日及5月5日的原周末調(diào)整為工作日。A3中計(jì)算結(jié)果如下:

注意2019年5月1日至3日為勞動(dòng)節(jié)假期,5月4日為周末,而5月5日的原周末調(diào)整為工作日,因此2019年4月30日后的第2個(gè)工作日是2019年5月6日。

B3和C3中的結(jié)果如下:

可以看到,在未指定調(diào)整日期序列的情況下,只會(huì)顯示周一到周五的日期;而A3中返回的結(jié)果才是正確的工作日。

 

用workdays() 可以得到工作日序列,更通用的計(jì)算日期時(shí)間序列的函數(shù)是periods(s,e,i),用來計(jì)算開始日期時(shí)間b和結(jié)束日期時(shí)間e之間的日期時(shí)間序列,間隔為i天。通過添加函數(shù)選項(xiàng)@y,@q,@m,@t,@s,可以調(diào)整時(shí)間間隔的單位為年,季度,月,旬或秒。如果不希望設(shè)定的結(jié)束值在結(jié)果中出現(xiàn),則可以添加@x選項(xiàng)。在時(shí)間序列中,出現(xiàn)的每個(gè)數(shù)據(jù)都會(huì)調(diào)整為指定時(shí)間段的第1天,如每月第1天,每年第1天等,如果不需要這種調(diào)整,可以添加@o選項(xiàng)。如:


A B C
1 2019-1-14 2019-1-20 2019-4-1
2 =periods(A1,B1) =periods@m(B1,C1)
3 =periods@xm(B1,C1) =periods@om(B1,C1) =periods@oxm(B1,C1)

A2,B2中結(jié)果如下:

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

A3中設(shè)定去除結(jié)束日期,B3中設(shè)置不調(diào)整日期到月初,C3中同時(shí)設(shè)定@o和@x選項(xiàng),結(jié)果如下:

 

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


A B C
1 2019-1-1 2020-1-1
2 =range(A1,B1,1:4) =range(A1,B1,3:4) =range(A1,B1,4)

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

使用range函數(shù)時(shí),如果前兩個(gè)參數(shù)為日期時(shí)間,則分段時(shí)將精確到日;如果前兩個(gè)參數(shù)為日期時(shí)間,則將精確到秒。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多