探秘QlikView中的日期字段及其使用技巧

浏览: 12254
  日期类型的字段是我们经常遇到和要处理的字段类型,相信有很多和我一样的开发者们都在处理日期类型的时候遇到了各种各样的问题,下面我们就一起来看一下QlikView中日期字段的奥秘及其使用技巧。
  在大部分的情况下,QlikView会根据自己的算法规则自动识别日期类型的数据,但是在一些情况下日期格式不能被正确的识别,这个时候就要在脚本上做一些处理以便让日期能够被QlikView正确识别。
  首先,在QlikView中是不存在数据类型的,QlikView中的所有字段的数据都具有二元性,也就是说每个字段数据都是以两种方式进行存储的(以字符或字符串来进行展现,以数字来进行存储)。跟Excel的方式类似,QlikView是以一些列连续的数字来存储日期,也就是公历的1899/12/31为第一天。大家可以新建一个文本对象,在里面输入num(date('1899/12/31'))看看结果是什么。另外,该数值的整数部分代表的哪一天,小数部分代表的是具体的时间,比如‘2012/1/31 6:00:00',在QlikView中就是以40939.25来存储的。既然是这样,那么这些字段就都可以顺理成章进行数学上的计算和比较,另外数字函数也就返回了日期字段的数字部分,而字符或者字符串函数也就返回了日期字段的字符或字符串部分。


pic1.png


pic2.png

 
  其次,在QlikView中处理日期和时间有两种重要的函数,一种称为解释函数,另一种称为格式函数,解释函数的功能是将字符或字符串转化为数字,常见的解释函数有Date#()和TimeStamp#();而格式函数的功能恰恰相反,该函数是将数字转化为字符或字符串,常见的格式函数有Date()和TimeStamp()。
  最后,了解了以上这些内容以后,怎样才能知道一个日期字段已经正确的被QlikView所解释了呢?很简单,把字段的格式在列表框里设置成数字然后再看看你得到了什么结果。

pic3.png

 
如果你得到的是一系列40000左右的数字(通常情况是右对齐),那么该日期字段就已经被QlikView所正确的解释了,如果你得到的还是一系列的日期戳(通常情况是左对齐),那么该日期字段就没有被正确的解释,这种情况下就要用到解释函数来帮助QlikView正确识别。

pic4.png

 
技巧1:正确使用解释函数
Date#(DateField,’M/D/YY’) as Date;
1.    确保使用了正确的解释函数而不是格式函数(注意中间的#号),脚本重新执行以后,检查该字段是否被正确的解释成了日期格式(检查是不是右对齐或者设置成数字来查看数值是不是在40000左右)。
2.    引号里面的日期格式要和字段里数据的格式一致。
3.    字母的大小写是敏感的,比如M代表的是月份而m代表的是分钟。
4.    字符串没必要是完整的日期,比如说一个字段只存储了月份信息,同样也可以把该月份的文本转化为时间格式。比如:Month( Date#( Month,'MMM') ) as Month

技巧2:使用内嵌函数
Date( Date#( DateField, 'M/D/YY'), 'YYYY-MM-DD') as Date
1.    内层函数确保了输入的字段的值被QlikView正确的解释,这样用来存储日期的数字被正确的创建。
2.    外层函数确保了该数字被正确的转化为想要输出的日期格式。
例子:
如果你有一个日期字段存储了’20120131’,中间没有斜杠和破折号,那么QlikView会错误的解释为整数20120131,而不是2012/01/31这一天所存储的数字,所以当你用该日期字段做减法的时候,比如20120131减去20120201的时候,你得到的是70而不是你想要的1.
那么我们就要借助该内嵌函数来帮助QlikView正确的解释,正确的格式应该为:
Date( Date#( DateField, 'YYYYMMDD'), 'M/D/YYYY') as Date


技巧3:使用MakeDate函数
如果你所使用的日期被存储在不同的字段里面,比如一个字段存储年份,一个字段存储月份,一个字段存储的天,那么你应该使用MakeDate函数,确保代表改日期的数字被正确的创建。
MakeDate( Year, Month, Day ) as Date

技巧4:使用变量存储日期格式的数字部分
虽然字段都是二元性的,但是变量却不是。
例子:
我们用变量存储一个日期数据:Let vToday = Today(),当我们在脚本中的where从句中使用该变量的时候:Where Date = $(vToday),比如当天是1/1/2015,那么该从句就把Date和1/1/2015进行比较,不过’1/1/2015’被解释成了1除以1除以2015,显然是错误的。这个时候如果我们把日期先转化为所代表的数字存储, Let vToday = Num(Today()),那么该问题就不存在了。所以建议大家在用变量存储日期的时候,都先转化为其对应的数字来。

技巧5:
使用Dual()函数
Dual()函数很有趣,该函数指定了用于显示的字符,同时又指定了对应该字符的所存储的数字。QlikView会将该字段视为数字字段。
例子:
Dual( Year( Date ) & '-w' & Week( Date ), WeekStart( Date ) ) as YearWeek
 

pic5.png

 
可以看到,左边的是字段所展现的值,右边是所对应的数字,我们在使用这个字段进行排序的时候,就可以将该字段视为数字类型,这样的话排序问题就不存在了,特别是存在跨年的时候。
 
推荐 3
本文由 曹浩 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

6 个评论

曹总真专业!学习了,我正好也要用到这个,谢谢分享!
又看到曹大师的文章了,受用!同志们顶起来!
受益匪浅!希望以后能看到更多的文章
请问,qv中如何获取当前季度?
PROFESSIONAL!!!!!!
你好,我问一下表格框中如何只显示10条记录(小于10条显示几条,大于十条只显示十条)

要回复文章请先登录注册