SPL 的日期时间函数

在数据分析计算中,日期时间类数据是比较特殊的类型,这里我们就来研究一下如何在SPL中使用日期时间类数据。

1日期时间数据的转换和生成

日期时间类数据,通常会用字符串来输入或显示。在使用集算器时,可以点击Tool>Option,在选项配置的Environment页面中,设定日期时间类型数据所使用的默认格式,如:

1555030501578100.png

使用SPL时,日期时间类型的数据会按照默认的格式显示出来,如:


A
1 =now()

运行后查看A1中的结果如下:

1555030495111100.png

这里用到的函数now() 是日期时间计算中比较常用的函数,可以获得系统中当前的日期时间。日期时间的显示在不同的语言环境中是不同的,特别是月份和星期等数据,下面都将以英文版的格式为例加以说明。

当需要输入日期时间类型的常数时,也可以直接按照格式输入字符串,此时SPL会自动将数据解析为日期时间数据,如:


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

A1,B1和C1会分别被解析为日期类型、日期时间类型和时间类型数据,如下:

1555030495943100.png1555030496142100.png1555030496206100.png

SPL可以把直接输入的常数解析为日期时间类型,但对于已经是字符串类型的,就需要用date(),time() 或者datetime() 将字符串转换为日期、时间或者日期时间数据,如:


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中是通过字符串运算得到的字符串:

1555030496277100.png1555030496335100.png1555030496395100.png

第3行用ifdate() 和iftime() 函数判断第2行的数据是否已被处理为日期或者时间类型(注意:判断日期类型和日期时间类型的数据,都使用ifdate()),A3,B3和C3中的结果如下:

1555030496448100.png1555030496448100.png1555030496448100.png

从结果可以看出,第2行中单元格值都不是日期或时间类数据,实际上都是字符串,显示也都和日期时间不同。

在第4行中,将字符串按照对应的格式分别转换为日期时间数据,结果如下:

1555030496505100.png1555030496559100.png1555030496636100.png

在第5行判断第4行的数据是否已被处理为日期或者时间类型,结果如下:

1555030496702100.png1555030496702100.png1555030496702100.png

当使用外部数据时,有时需要处理不同格式的日期时间数据,这时可以在使用date(),time() 或者datetime() 时,在字符串后添加使用的显示格式串,如:


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行中的数据都并没有用默认的日期时间格式,而且B1和C1都在前面添加了 ' 字符表示使用字符串常数,A1,B1和C1中的数据如下:

1555030496793100.png1555030496863100.png1555030496916100.png

需要注意的是,月份格式MMM的设定是和语言环境相关的,英文环境中表示月份的英文缩写,如Feb;而中文环境中则会显示为中文月份。

第2行中列出的格式串指示SPL如何解析第1行中的数据,第3行使用这些格式串进行转换,结果如下:

1555030497003100.png1555030497064100.png1555030497131100.png

完成类型转换后,查看结果时仍然会用默认的格式显示。如果要用其他格式显示,可以用string(d,fmt)函数,将日期时间类数据转换为指定格式的字符串,如:


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中,将日期时间类数据转换为指定格式的字符串:

1555030497189100.png1555030497272100.png1555030497350100.png

当然,也可以根据需要直接修改默认的日期时间显示格式。

在用date(),time() 或者datetime() 生成数据类型时,还可以直接依次指定年,月,日,时,分,秒等各个分量:


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

结果如下:

1555030497438100.png1555030497521100.png1555030497592100.png

在指定各个分量时,要注意每个整数的合理范围,例如小时分量在0~23之间。

2日期时间数据的显示格式


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

这个例子中,A1中用date()生成日期,第一个参数使用了6位数,SPL将用其同时表示年和月。而C1则将A1中的日期和B1中的时间合并得到日期时间数据,结果如下:

1555030497653100.png1555030497718100.png1555030497795100.png

上一节已经使用到了日期时间数据的一些显示格式,用格式字符串来指定显示样式,例如yyyy表示4位数的年份、dd表示2位数的日期等。下面将具体说明格式串中各个字符的作用,并以C1中的数据为例显示相应的格式化结果:

字符 作用 SPL 结果
y/yy 年,两位数字 =string(C1,"yy") 1555032563139100.png
yyyy 年,四位数字 =string(C1,"yyyy") 1555032561928100.png
M =string(C1,"M") 1555032562002100.png
MM 月,两位数字,不足用0补齐 =string(C1,"MM") 1555032562056100.png
MMM 月,英文简写 =string(C1,"MMM") 1555032562111100.png
MMMM 月,英文全拼 =string(C1,"MMMM") 1555032562172100.png
d =string(C1,"d") 1555032562238100.png
dd 日,两位数字,不足用0补齐 =string(C1,"dd") 1555032562238100.png
E 星期,英文简写 =string(C1,"E") 1555032562301100.png
EEEE 星期,英文全拼 =string(C1,"EEEE") 1555032562301100.png
G Era标识符,公元前/公元后,缩写 =string(C1,"G") 1555032562364100.png
w 本年的第几周 =string(C1,"w") 1555032562427100.png
ww 本年的第几周,两位数字,不足用0补齐 =string(C1,"ww") 1555032562427100.png
W 本月的第几周 =string(C1,"W") 1555032562483100.png
F 在本月的第几周,仅根据日计算 =string(C1,"F") 1555032562483100.png
D 本年的第几天 =string(C1,"D") 1555032562536100.png
H 小时,24小时制,0~23 =string(C1,"H") 1555032562594100.png
HH 小时,24小时制,0~23,两位数字,不足用0补齐 =string(C1,"HH") 1555032562594100.png
k 小时,24小时制,1~24 =string(C1,"k") 1555032562594100.png
kk 小时,24小时制,1~24,两位数字,不足用0补齐 =string(C1,"kk") 1555032562594100.png
h 小时,12小时制,1~12 =string(C1,"h") 1555032562659100.png
hh 小时,12小时制,1~12,两位数字,不足用0补齐 =string(C1,"hh") 1555032562719100.png
K 小时,12小时制,0~11 =string(C1,"K") 1555032562659100.png
KK 小时,12小时制,0~11,两位数字,不足用0补齐 =string(C1,"KK") 1555032562719100.png
m 分钟 =string(C1,"m") 1555032562483100.png
mm 分钟,两位数字,不足用0补齐 =string(C1,"mm") 1555032562770100.png
s =string(C1,"s") 1555032562822100.png
ss 秒,两位数字,不足用0补齐 =string(C1,"ss") 1555032562822100.png
S 毫秒 =string(C1,"S") 1555032562872100.png
a 上午/下午 =string(C1,"a") 1555032562917100.png
z 时区,缩写 =string(C1,"z") 1555032562969100.png
zzzz 时区,全拼 =string(C1,"zzzz") 1555032563030100.png
Z 时区代码 =string(C1,"Z") 1555032563090100.png

3从日期时间数据中获取信息

在日期时间等类型的数据中,具体的年,月,日,时,分,秒等常常是处理时需要单独使用的信息,我们可以通过year(),month(),day(),hour(),minute(),second(),millisecond()等函数获得这些日期时间数据中的各个分量:


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中的日期时间数据如下:

1555030499484100.png1555030496142100.png1555030499541100.png

A2,B2和C2从日期数据中分别获取年、月、日:

1555030499597100.png1555030499681100.png1555030499770100.png

A3,B3和C3从时间数据中获取时、分、秒:

1555030499844100.png1555030499915100.png1555030499770100.png

A4,B4和C4从now() 函数的日期时间类型结果中获取月,小时和毫秒分量:

1555030499976100.png1555030500046100.png

从结果中可以看到,now() 函数返回的结果会精确到毫秒,但显示时只会显示到秒。在使用now() 函数时,可以通过添加选项的方法来改变结果的精度。如:


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

A1中添加@d选项,只取日期部分数据,B1中添加@t选项,只取时间部分数据,结果如下:

1555030500177100.png1555030500233100.png

A2中添加@m选项,数据将精确到分,B2中添加@s选项,获得的数据将精确到秒,结果如下:

1555030500301100.png1555030500364100.png

在C2中可以看到,B2中的数据毫秒分量为0:

1555030500435100.png

@m和@s选项,也可以用在datetime() 和time() 函数中,设定转换日期时间数据及时间数据时的精度为分或秒。

在日期类型数据中,也可以获取到时间分量,从时间类型数据中也可以获取日期分量,如:


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中结果如下:

1555030500435100.png1555030500435100.png1555030500435100.png

也就是说,单独的日期数据,其中的时间指定为00:00:00。

A3中的month函数添加了@y选项,获得年月组成的6位数,A3和B3中结果如下:

1555030500508100.png1555030500572100.png

也就是说,单独的时间数据,其中的日期为1970年1月1日。

除了直接从日期时间类型的数据中获取各个分量,还有一些函数可以用来获得日期相关的数据。

使用day@w(),在获取日期分量时添加@w选项,可以获得本日是一周中的第几天:


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获取各个日期分别是一周中的第几天,结果如下:

1555030499976100.png1555030500630100.png1555030500715100.png

SPL中,每周的第1天是从周日开始计算的,在第3行中用显示字符串的方式取得了每一天是星期几:

1555030500775100.png1555030500839100.png1555030500908100.png

另外,我们还可以使用pdate() 函数,配合不同的选项获得日期


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() 函数中:

○   直接使用@w选项可以获得本周第1天的日期,从周日开始计算;

○   添加@m选项可以获得本月第1天的日期;

○   添加@q选项可以获得本季度第1天的日期;

○   添加@e则可以获得某个时间段最后一天的数据,如本周最后一天,本季度最后一天等。A2,B2,C2,A3,B3和C3中的结果依次如下:

1555030500980100.png1555030501054100.png1555030501106100.png

1555030501157100.png1555030501220100.png1555030501278100.png

SPL中还可以使用days() 函数计算某日期所在月的总天数,添加@q选项可以得到所在季度的总天数,添加@y选项可以得到整年的总天数,如:


A B C
1 2019-02-21

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

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

1555030501363100.png1555030501433100.png1555030501509100.png

4使用日期时间数据的计算

除了直接从日期时间数据中获取信息,在SPL中还可以使用日期时间类数据来执行各类计算。

最常用的有关日期的计算就是计算年龄:


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

A1和B1中的数据如下:

1555030501666100.png1555030500177100.png

在第2行用age() 函数,根据A1中的生日来计算年龄,计算年龄时,是以当前的日期为准的,默认情况将精确到日,添加@m可以将精度设为月,添加@y可以将精度设定为年。在不同精度的情况下,计算所得的年龄可能会有区别,A2,B2和C2中得到的年龄分别如下:

1555030501724100.png1555030501786100.png1555030501786100.png

使用age() 函数,类似于计算生日日期和当前日期间隔的年数。更普遍的计算时间间隔的函数是interval() 函数,用这个函数可以计算两个日期时间数据之间相差多少天,添加@y,@q,@m,@s,@ms等选项,可以计算间隔多少年,季度,月,秒或毫秒。例如:


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

如果只需要计算两个日期之间相差多少天,也可以直接用减法完成,A2,B2和C2中的结果如下:

1555030501873100.png1555030501935100.png1555030501873100.png

特别的,每个日期时间数据都可以转换为一个对应的长整数,这个长整数其实就是指定的日期时间和1970年1月1日,格林威治时间0:00:00的间隔毫秒数,如:


A B
1 =datetime("1/1/1970 0:00:00   GMT","m/d/yyyy H

0

收藏

raqsoft

157篇文章,6W+人气,0粉丝

致力于大数据开发,与一切不可能sayno

Ctrl+Enter 发布

发布

取消

扫一扫,领取大礼包

0

分享
raqsoft

猜你喜欢

转载自blog.51cto.com/12749034/2429394