官方说明:
返回dateTime(即日期时间值dateTime)的文本表示形式。此函数采用一个可选格式参数format。有关支持的格式的完整列表,请参阅库规范文档。
DateTime.ToText( dateTime as nullable datetime, optional format as nullable text, optional culture as nullable text) as nullable text
解读:
标题简化了下,本文将介绍6个函数,分别为DateTime.FromText
,DateTime.ToText
,Date.FromText
,Date.ToText
,Time.FromText
,Time.ToText
。
听名字就知道,这几个函数用于对日期时间和文本之间的相互转换,语法差不多,所以只放了其中一个说明,上面提到的库规范文档在这里。
日期时间转文本:
第一参数为日期时间值,第二参数为需要格式化的格式。如现有日期时间为#datetime(2017,7,9,17,4,32),在PQ中显示为"2017/7/9 17:04:32",需要转成"2017年7月9日下午5时4分32秒"。
如果不知道这个函数你可能会分别取出每一个的值,然后用&连接得到结果,但是显然这样做太傻了。你可以直接这样= DateTime.ToText(#datetime(2017,7,9,17,4,32),"yyyy年M月d日tth时m分s秒")
。没错,和DAX的format及工作表函数的text的用法差不多。需要注意的是,月(month)和分(minute)缩写都是m,所以为了区分,大写M代表月,小写m代表分。
第三参数为区域选项,比如写成= DateTime.ToText(#datetime(2017,7,9,17,4,32),null,"zh-cn")
,返回的是按照我们中国人习惯的"2017/7/9 17:04:32";而如果写成= DateTime.ToText(#datetime(2017,7,9,17,4,32),null,"en-us")
则返回的是按照美国人习惯的"7/9/2017 5:04:32 PM",当然还有其他区域,如果省略则默认为系统当前区域。
举几个栗子:
dt= #datetime(2017,7,9,17,4,32), a= DateTime.ToText(dt,"yyyy/MM/ddThh:mm:ss"), //"2017/07/09T05:04:32" b= DateTime.ToText(dt,"yyyy-MM-dd"), //"2017-07-09" c= DateTime.ToText(dt,"yyyy啊MM啊dd啊"), //"2017啊07啊09啊" d= DateTime.ToText(dt,"yy年M月d日"), //"17年7月9日" e= DateTime.ToText(dt,"yy年M月d日 dddd"), //"17年7月9日 星期日" f= DateTime.ToText(dt,"yy年M月d日 ddd"), //"17年7月9日 周日" g= DateTime.ToText(dt,"y年MMMM"), //"17年七月" h= DateTime.ToText(dt,"y年MMMM","en-us"), //"17年July" i= DateTime.ToText(dt,"MMM yyyy","en-us"), //"Jul 2017" j= DateTime.ToText(dt,"MMM yyyy dddd","en-us"), //"Jul 2017 Sunday" k= DateTime.ToText(dt,"MMM-dd yyyy ddd","en-us"), //"Jul-09 2017 Sun" l= DateTime.ToText(dt,"T"), //"17:04:32" m= DateTime.ToText(dt,"t"), //"17:04" n= DateTime.ToText(dt,"tt"), //"下午" o= DateTime.ToText(dt,"tt h:m:s"), //"下午 5:4:32" p= DateTime.ToText(dt,"h:m:s tt","en-us") //"5:4:32 PM" q= DateTime.ToText(dt,"HH:mm:ss") //"17:04:32"
看到这应该能了解各个字母及不同数量分别代表的意思,Date.ToText
和Time.ToText
同上就不一一介绍了。
可搭配出的组合远不止以上几种,请自行测试。
文本转日期时间:
往往从系统导出的数据都是文本格式,如果格式规范PQ一般能自动识别并更改类型,但是免不了有些不规范格式会识别不了,这时候就可以尝试下FromText。
因为转成日期时间格式不需要格式化,所以只需要两个参数:第一参数为文本格式的日期时间,第二参数为区域选项。
继续看栗子,我们把刚才转换的文本格式再反过来,并又加了几条试试:
其中大部分都可以识别,大致可以从中总结出以下规律:
- 如果指代不明则识别不了,比如"201711",系统无法识别其中的11到底是1月1日还是11月
- 如果格式正确但没有提供值则默认为最小值,比如"Jul 2017"默认显示为"2017/7/1 00:00:00",日期为1,时间为0
- 以上两条都是猜的。。。请自行尝试
注意图中最后一条,"20170709050432",按理说应该可以识别啊可是为什么显示Error呢?
原来标准的格式在日期和时间之间有一个T,为"20170709T050432",所以得先在文本中间插入一个T:= DateTime.FromText(Text.Insert("20170709050432",8,"T"))
,这样就能正确的返回结果了。
DataFormat.Error: 无法分析提供给 Date 值的输入。是什么原因?
就是对象无法转换成日期格式呗