在数据分析计算中,日期时间类数据是比较特殊的类型,这里我们就来研究一下如何在SPL中使用日期时间类数据。
1日期时间数据的转换和生成
日期时间类数据,通常会用字符串来输入或显示。在使用集算器时,可以点击Tool>Option,在选项配置的Environment页面中,设定日期时间类型数据所使用的默认格式,如:
![fabb9b702673e457ac2f9c889700d34e.png](https://img-blog.csdnimg.cn/img_convert/fabb9b702673e457ac2f9c889700d34e.png)
使用SPL时,日期时间类型的数据会按照默认的格式显示出来,如:
![e2d02a93a0380201d44bbfa103b0db47.png](https://img-blog.csdnimg.cn/img_convert/e2d02a93a0380201d44bbfa103b0db47.png)
运行后查看A1中的结果如下:
![8e6ad361963afe4a58cb3c8d6df49313.png](https://img-blog.csdnimg.cn/img_convert/8e6ad361963afe4a58cb3c8d6df49313.png)
这里用到的函数now() 是日期时间计算中比较常用的函数,可以获得系统中当前的日期时间。日期时间的显示在不同的语言环境中是不同的,特别是月份和星期等数据,下面都将以英文版的格式为例加以说明。
当需要输入日期时间类型的常数时,也可以直接按照格式输入字符串,此时SPL会自动将数据解析为日期时间数据,如:
![32d07acb810c95139a42163c17fa7cba.png](https://img-blog.csdnimg.cn/img_convert/32d07acb810c95139a42163c17fa7cba.png)
A1,B1和C1会分别被解析为日期类型、日期时间类型和时间类型数据,如下:
![7aee6adb8f4ab5d875c104a882286610.png](https://img-blog.csdnimg.cn/img_convert/7aee6adb8f4ab5d875c104a882286610.png)
![005b1d49841fa789fdc7ba140e08c069.png](https://img-blog.csdnimg.cn/img_convert/005b1d49841fa789fdc7ba140e08c069.png)
![7ad78bbbda720095c65de9e1799a1928.png](https://img-blog.csdnimg.cn/img_convert/7ad78bbbda720095c65de9e1799a1928.png)
SPL可以把直接输入的常数解析为日期时间类型,但对于已经是字符串类型的,就需要用date(),time() 或者datetime() 将字符串转换为日期、时间或者日期时间数据,如:
![2e4dfd9c629ff6661a65aa832685ce21.png](https://img-blog.csdnimg.cn/img_convert/2e4dfd9c629ff6661a65aa832685ce21.png)
A2,B2和C2中是通过字符串运算得到的字符串:
![8d1d8b72b9c77119fbb9428646c136fb.png](https://img-blog.csdnimg.cn/img_convert/8d1d8b72b9c77119fbb9428646c136fb.png)
![cfd612b938123bdc9f6113fa87a5cc01.png](https://img-blog.csdnimg.cn/img_convert/cfd612b938123bdc9f6113fa87a5cc01.png)
![cf6462280412b64ec3804c4d341dd408.png](https://img-blog.csdnimg.cn/img_convert/cf6462280412b64ec3804c4d341dd408.png)
第3行用ifdate() 和iftime() 函数判断第2行的数据是否已被处理为日期或者时间类型(注意:判断日期类型和日期时间类型的数据,都使用ifdate()),A3,B3和C3中的结果如下:
![d72104785052fb90c2ac87226c13930a.png](https://img-blog.csdnimg.cn/img_convert/d72104785052fb90c2ac87226c13930a.png)
![d72104785052fb90c2ac87226c13930a.png](https://img-blog.csdnimg.cn/img_convert/d72104785052fb90c2ac87226c13930a.png)
![d72104785052fb90c2ac87226c13930a.png](https://img-blog.csdnimg.cn/img_convert/d72104785052fb90c2ac87226c13930a.png)
从结果可以看出,第2行中单元格值都不是日期或时间类数据,实际上都是字符串,显示也都和日期时间不同。
在第4行中,将字符串按照对应的格式分别转换为日期时间数据,结果如下:
![c2b43bc15b1ad17dfab52f1137c0875d.png](https://img-blog.csdnimg.cn/img_convert/c2b43bc15b1ad17dfab52f1137c0875d.png)
![391f8177a13fa1a9f0fbc67400e855fb.png](https://img-blog.csdnimg.cn/img_convert/391f8177a13fa1a9f0fbc67400e855fb.png)
![3269708eb19650e3d66e3249a137565c.png](https://img-blog.csdnimg.cn/img_convert/3269708eb19650e3d66e3249a137565c.png)
在第5行判断第4行的数据是否已被处理为日期或者时间类型,结果如下:
![adf468b601aa8a64f6edf8ee6e987bee.png](https://img-blog.csdnimg.cn/img_convert/adf468b601aa8a64f6edf8ee6e987bee.png)
![adf468b601aa8a64f6edf8ee6e987bee.png](https://img-blog.csdnimg.cn/img_convert/adf468b601aa8a64f6edf8ee6e987bee.png)
![adf468b601aa8a64f6edf8ee6e987bee.png](https://img-blog.csdnimg.cn/img_convert/adf468b601aa8a64f6edf8ee6e987bee.png)
当使用外部数据时,有时需要处理不同格式的日期时间数据,这时可以在使用date(),time() 或者datetime() 时,在字符串后添加使用的显示格式串,如:
![06306d1ecf84b187b6a4a62ca842fc68.png](https://img-blog.csdnimg.cn/img_convert/06306d1ecf84b187b6a4a62ca842fc68.png)
在第1行中的数据都并没有用默认的日期时间格式,而且B1和C1都在前面添加了 ' 字符表示使用字符串常数,A1,B1和C1中的数据如下:
![905bbf7067b2be54c6bda016cbcdd145.png](https://img-blog.csdnimg.cn/img_convert/905bbf7067b2be54c6bda016cbcdd145.png)
![e0da930496a00e06a84e5d53989f9232.png](https://img-blog.csdnimg.cn/img_convert/e0da930496a00e06a84e5d53989f9232.png)
![799f6e233cd89bf06d0eb431a7cb7f1c.png](https://img-blog.csdnimg.cn/img_convert/799f6e233cd89bf06d0eb431a7cb7f1c.png)
需要注意的是,月份格式MMM的设定是和语言环境相关的,英文环境中表示月份的英文缩写,如Feb;而中文环境中则会显示为中文月份。
第2行中列出的格式串指示SPL如何解析第1行中的数据,第3行使用这些格式串进行转换,结果如下:
![0340e800fedc7f0cebdc5ddb96ef75c1.png](https://img-blog.csdnimg.cn/img_convert/0340e800fedc7f0cebdc5ddb96ef75c1.png)
![9d0191995d41db6fdc6236624d7b5c38.png](https://img-blog.csdnimg.cn/img_convert/9d0191995d41db6fdc6236624d7b5c38.png)
![61dedced7e3a24ce0f0be260745c9ece.png](https://img-blog.csdnimg.cn/img_convert/61dedced7e3a24ce0f0be260745c9ece.png)
完成类型转换后,查看结果时仍然会用默认的格式显示。如果要用其他格式显示,可以用string(d,fmt)函数,将日期时间类数据转换为指定格式的字符串,如:
![2ffdaa4e47ea694ded749e9bf1404abe.png](https://img-blog.csdnimg.cn/img_convert/2ffdaa4e47ea694ded749e9bf1404abe.png)
A3,B3和C3中,将日期时间类数据转换为指定格式的字符串:
![8b6123f7779bc3e5c330e1ffe7951cfc.png](https://img-blog.csdnimg.cn/img_convert/8b6123f7779bc3e5c330e1ffe7951cfc.png)
![5dea1a95d97624fbf60fc91ee0424828.png](https://img-blog.csdnimg.cn/img_convert/5dea1a95d97624fbf60fc91ee0424828.png)
![14e8a70abc937fe0d76a1d26197633e9.png](https://img-blog.csdnimg.cn/img_convert/14e8a70abc937fe0d76a1d26197633e9.png)
当然,也可以根据需要直接修改默认的日期时间显示格式。
在用date(),time() 或者datetime() 生成数据类型时,还可以直接依次指定年,月,日,时,分,秒等各个分量:
![5df704cdfad03fea0332f17b5a3fc18a.png](https://img-blog.csdnimg.cn/img_convert/5df704cdfad03fea0332f17b5a3fc18a.png)
结果如下:
![800aa1dd7813843961243b75f83f3c33.png](https://img-blog.csdnimg.cn/img_convert/800aa1dd7813843961243b75f83f3c33.png)
![3e4bc28613207829126740fcf246ec96.png](https://img-blog.csdnimg.cn/img_convert/3e4bc28613207829126740fcf246ec96.png)
![181d4e38534fa14a482ba78086effe71.png](https://img-blog.csdnimg.cn/img_convert/181d4e38534fa14a482ba78086effe71.png)
在指定各个分量时,要注意每个整数的合理范围,例如小时分量在0~23之间。
2日期时间数据的显示格式
![8dd2ec2a064c8d13df28a3aa1afcfaa1.png](https://img-blog.csdnimg.cn/img_convert/8dd2ec2a064c8d13df28a3aa1afcfaa1.png)
这个例子中,A1中用date()生成日期,第一个参数使用了6位数,SPL将用其同时表示年和月。而C1则将A1中的日期和B1中的时间合并得到日期时间数据,结果如下:
![8cdb4baecb7ba1ee2a15307be9d55b50.png](https://img-blog.csdnimg.cn/img_convert/8cdb4baecb7ba1ee2a15307be9d55b50.png)
![0d3f75213d446d11b23c411184f40d8c.png](https://img-blog.csdnimg.cn/img_convert/0d3f75213d446d11b23c411184f40d8c.png)
![92474278a1e5cb341c9bb369ed677b9b.png](https://img-blog.csdnimg.cn/img_convert/92474278a1e5cb341c9bb369ed677b9b.png)
上一节已经使用到了日期时间数据的一些显示格式,用格式字符串来指定显示样式,例如yyyy表示4位数的年份、dd表示2位数的日期等。下面将具体说明格式串中各个字符的作用,并以C1中的数据为例显示相应的格式化结果:
![0249636775234e4beed122afabdfe250.png](https://img-blog.csdnimg.cn/img_convert/0249636775234e4beed122afabdfe250.png)
![c6ca585591a806b2bc2941c16d62d548.png](https://img-blog.csdnimg.cn/img_convert/c6ca585591a806b2bc2941c16d62d548.png)
3从日期时间数据中获取信息
在日期时间等类型的数据中,具体的年,月,日,时,分,秒等常常是处理时需要单独使用的信息,我们可以通过year(),month(),day(),hour(),minute(),second(),millisecond()等函数获得这些日期时间数据中的各个分量:
![c8af431bf31e149778b3c97b7129ca54.png](https://img-blog.csdnimg.cn/img_convert/c8af431bf31e149778b3c97b7129ca54.png)
A1,B1和C1中的日期时间数据如下:
![628b4a2678c83f3a7aab1ae5151d4ef0.png](https://img-blog.csdnimg.cn/img_convert/628b4a2678c83f3a7aab1ae5151d4ef0.png)
![005b1d49841fa789fdc7ba140e08c069.png](https://img-blog.csdnimg.cn/img_convert/005b1d49841fa789fdc7ba140e08c069.png)
![18c9b1b46130f7756f8e612d770670f5.png](https://img-blog.csdnimg.cn/img_convert/18c9b1b46130f7756f8e612d770670f5.png)
A2,B2和C2从日期数据中分别获取年、月、日:
![939f7959da8962ffe8c717a20caf2db8.png](https://img-blog.csdnimg.cn/img_convert/939f7959da8962ffe8c717a20caf2db8.png)
![050bdf9012c4c0de2ff8cfb9c34311fd.png](https://img-blog.csdnimg.cn/img_convert/050bdf9012c4c0de2ff8cfb9c34311fd.png)
![304fedca248fa9e8905fe9e396dc4575.png](https://img-blog.csdnimg.cn/img_convert/304fedca248fa9e8905fe9e396dc4575.png)
A3,B3和C3从时间数据中获取时、分、秒:
![78981e4fd90abde99e6f4d55ce351551.png](https://img-blog.csdnimg.cn/img_convert/78981e4fd90abde99e6f4d55ce351551.png)
![818ac79c21287a481e3dd06720344919.png](https://img-blog.csdnimg.cn/img_convert/818ac79c21287a481e3dd06720344919.png)
![304fedca248fa9e8905fe9e396dc4575.png](https://img-blog.csdnimg.cn/img_convert/304fedca248fa9e8905fe9e396dc4575.png)
A4,B4和C4从now() 函数的日期时间类型结果中获取月,小时和毫秒分量:
![aabe6a913a4801c3f7d139288485ff97.png](https://img-blog.csdnimg.cn/img_convert/aabe6a913a4801c3f7d139288485ff97.png)
![f2c803d77c48e0bfc22e3de2393dfaa5.png](https://img-blog.csdnimg.cn/img_convert/f2c803d77c48e0bfc22e3de2393dfaa5.png)
![6543fa9d50aad5a8cdfb262bd764051b.png](https://img-blog.csdnimg.cn/img_convert/6543fa9d50aad5a8cdfb262bd764051b.png)
从结果中可以看到,now() 函数返回的结果会精确到毫秒,但显示时只会显示到秒。在使用now() 函数时,可以通过添加选项的方法来改变结果的精度。如:
![16bd123c3aa2b49fcd4b8ab64cd40f10.png](https://img-blog.csdnimg.cn/img_convert/16bd123c3aa2b49fcd4b8ab64cd40f10.png)
A1中添加@d选项,只取日期部分数据,B1中添加@t选项,只取时间部分数据,结果如下:
![78cb2966003d2e0119b42999ec98e126.png](https://img-blog.csdnimg.cn/img_convert/78cb2966003d2e0119b42999ec98e126.png)
![57ce61a3025d368a32d22d48a1d3a7b5.png](https://img-blog.csdnimg.cn/img_convert/57ce61a3025d368a32d22d48a1d3a7b5.png)
A2中添加@m选项,数据将精确到分,B2中添加@s选项,获得的数据将精确到秒,结果如下:
![0e08ac9c567582502885489aa6019516.png](https://img-blog.csdnimg.cn/img_convert/0e08ac9c567582502885489aa6019516.png)
![854cdab29b6dc629de5adeacdc74e786.png](https://img-blog.csdnimg.cn/img_convert/854cdab29b6dc629de5adeacdc74e786.png)
在C2中可以看到,B2中的数据毫秒分量为0:
![b86499f0a54997de6b1863b1d9b7c2c4.png](https://img-blog.csdnimg.cn/img_convert/b86499f0a54997de6b1863b1d9b7c2c4.png)
@m和@s选项,也可以用在datetime() 和time() 函数中,设定转换日期时间数据及时间数据时的精度为分或秒。
在日期类型数据中,也可以获取到时间分量,从时间类型数据中也可以获取日期分量,如:
![b87a4a29cc10bc92bdcf19df727f50a8.png](https://img-blog.csdnimg.cn/img_convert/b87a4a29cc10bc92bdcf19df727f50a8.png)
A2,B2和C2中结果如下:
![b86499f0a54997de6b1863b1d9b7c2c4.png](https://img-blog.csdnimg.cn/img_convert/b86499f0a54997de6b1863b1d9b7c2c4.png)
![b86499f0a54997de6b1863b1d9b7c2c4.png](https://img-blog.csdnimg.cn/img_convert/b86499f0a54997de6b1863b1d9b7c2c4.png)
![b86499f0a54997de6b1863b1d9b7c2c4.png](https://img-blog.csdnimg.cn/img_convert/b86499f0a54997de6b1863b1d9b7c2c4.png)
也就是说,单独的日期数据,其中的时间指定为00:00:00。
A3中的month函数添加了@y选项,获得年月组成的6位数,A3和B3中结果如下:
![5528688ccf30eb380867fc76dd5ddda9.png](https://img-blog.csdnimg.cn/img_convert/5528688ccf30eb380867fc76dd5ddda9.png)
![413f9dd394240e5ef1a599cc1f3e5a08.png](https://img-blog.csdnimg.cn/img_convert/413f9dd394240e5ef1a599cc1f3e5a08.png)
也就是说,单独的时间数据,其中的日期为1970年1月1日。
除了直接从日期时间类型的数据中获取各个分量,还有一些函数可以用来获得日期相关的数据。
使用day@w(),在获取日期分量时添加@w选项,可以获得本日是一周中的第几天:
![3616c24e43284ecffedd597b7bfcb528.png](https://img-blog.csdnimg.cn/img_convert/3616c24e43284ecffedd597b7bfcb528.png)
A2,B2和C2获取各个日期分别是一周中的第几天,结果如下:
![aabe6a913a4801c3f7d139288485ff97.png](https://img-blog.csdnimg.cn/img_convert/aabe6a913a4801c3f7d139288485ff97.png)
![f969d82e955b90a1e7639a1a98c011b4.png](https://img-blog.csdnimg.cn/img_convert/f969d82e955b90a1e7639a1a98c011b4.png)
![d42788f1acf2ec55312a70a7667011f2.png](https://img-blog.csdnimg.cn/img_convert/d42788f1acf2ec55312a70a7667011f2.png)
SPL中,每周的第1天是从周日开始计算的,在第3行中用显示字符串的方式取得了每一天是星期几:
![4fa56430cf4b11c902e4e8854e5d8428.png](https://img-blog.csdnimg.cn/img_convert/4fa56430cf4b11c902e4e8854e5d8428.png)
![774d37c0cf32488aef9f29f0479753d3.png](https://img-blog.csdnimg.cn/img_convert/774d37c0cf32488aef9f29f0479753d3.png)
![1d7c4e66e0e96d1d3f6d44ddbdd0416d.png](https://img-blog.csdnimg.cn/img_convert/1d7c4e66e0e96d1d3f6d44ddbdd0416d.png)
另外,我们还可以使用pdate() 函数,配合不同的选项获得日期
![dabd50123e38db38aba22b0c059b8fd0.png](https://img-blog.csdnimg.cn/img_convert/dabd50123e38db38aba22b0c059b8fd0.png)
在pdate() 函数中:
○ 直接使用@w选项可以获得本周第1天的日期,从周日开始计算;
○ 添加@m选项可以获得本月第1天的日期;
○ 添加@q选项可以获得本季度第1天的日期;
○ 添加@e则可以获得某个时间段最后一天的数据,如本周最后一天,本季度最后一天等。A2,B2,C2,A3,B3和C3中的结果依次如下:
![ae0a6a03a02060d3f98f8d6bc75d39d8.png](https://img-blog.csdnimg.cn/img_convert/ae0a6a03a02060d3f98f8d6bc75d39d8.png)
![c9c61211b66550a66f95e66df2ce630f.png](https://img-blog.csdnimg.cn/img_convert/c9c61211b66550a66f95e66df2ce630f.png)
![227a98264abfccf03e22468015b6ba8a.png](https://img-blog.csdnimg.cn/img_convert/227a98264abfccf03e22468015b6ba8a.png)
![b67c054278958b3aff1bad8b48e3433a.png](https://img-blog.csdnimg.cn/img_convert/b67c054278958b3aff1bad8b48e3433a.png)
![4cea22010edc7305eb5df2294a30e511.png](https://img-blog.csdnimg.cn/img_convert/4cea22010edc7305eb5df2294a30e511.png)
![0da511af682cd9a16cc3aa53a079659e.png](https://img-blog.csdnimg.cn/img_convert/0da511af682cd9a16cc3aa53a079659e.png)
SPL中还可以使用days() 函数计算某日期所在月的总天数,添加@q选项可以得到所在季度的总天数,添加@y选项可以得到整年的总天数,如:
![07da656bad4b443050898a81db925cbf.png](https://img-blog.csdnimg.cn/img_convert/07da656bad4b443050898a81db925cbf.png)
A2,B2和C2中的结果如下:
![22294ea6f20f61611ef49e4a632da6ee.png](https://img-blog.csdnimg.cn/img_convert/22294ea6f20f61611ef49e4a632da6ee.png)
![a30b082f9527d51a6c8092f1ba48720d.png](https://img-blog.csdnimg.cn/img_convert/a30b082f9527d51a6c8092f1ba48720d.png)
![dd37fb69f6025588087bda09d4d2d6c8.png](https://img-blog.csdnimg.cn/img_convert/dd37fb69f6025588087bda09d4d2d6c8.png)