十月 16, 2019

Fix power bi service timezone issue 解决POWER BI服务中报表显示本地时间错误的问题

作者 ladydumbo

今天想和大家说一说,POWER BI服务中报表显示本地时间‘’错误‘’的问题。

POWER BI SERVICE是云服务,也就是说当我们把报表从POWER BI DESKTOP上传到POWER BI SERVICE后,数据集被寄存在Microsoft遍布全球的云服务器中的某一个。这时,就会存在一个问题 : 我们本地环境的时间和云服务器的当地时间不同。所以,在本地使用一些与时间有关的函数,例如: NOW( ), TODAY( )时,就要考虑到这个情况。

比如,想要在报表中显示一个数据集的刷新时间(RefreshTime)时,有两种方法 :

  • 使用DAX函数
Last Refreshed (Local) = 
FORMAT(Today();"dd-mm-yyyy")&" " &" à "&" "&FORMAT(TIME(HOUR(NOW());MINUTE(NOW());SECOND(NOW()));"hh:mm:ss")
  • 使用Power Query
let
Source = #table(type table[LastRefresh=datetime], {{DateTime.LocalNow()}})
in
Source

此时,在POWER BI DESKTOP中,创建一个measure : [RefreshTime],使用卡片来展示,我们得到此刻的时间 : 2019/10/16 15:01:46

此刻的时间 : [RefreshTime]

但是,将报表上传到POWER BI SERVICE之后,诡异的事情发生了,同一个图表,我的时间却少了2个小时,从15点变成了13点?发生了什么呢?

(此时距离上一步操作已经过去了6分钟)

由于我所在的巴黎,本地时区为CEST UTC+2,所以很明显,POWER BI SERVICE所展示的时间为UTC时间。

那么我们该如何解决这个问题呢?如何保证 POWER BI SERVICE 中显示的时间永远是我们的本地时间?

我在这里总结了两个方法,希望可以帮到大家。

第一种,已经知晓时区,所以使用DAX或Power Query增添时间,达到强制转换时区的效果。

RefreshTime = 
FORMAT([Today];"dd-mm-yyyy")&" " &" à "&" "&FORMAT(TIME(HOUR(NOW())+2;MINUTE(NOW());SECOND(NOW()));"hh:mm:ss")
let
Source = #table(type table[LastRefresh=datetime],{{DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),2,0)}})
in
Source

第二种,使用第三方的数据,使用来自Web的时间,比如以下的两个网站,可以查询全世界各个角落的当地时间和时区信息。

https://www.timeanddate.com/

http://localtimes.info/

我找到了巴黎的当地时间页面, https://www.timeanddate.com/worldclock/france/paris

这时,我们使用POWER BI DESKTOP增添新的Web数据源 :

写入链接,

或者直接使用这段代码 :

Let
Source = Web.Page(Web.Contents("http://localtimes.info/Oceania/New_Zealand/Auckland/")),
Data1 = Source{1}[Data],
#"Changed Type" = Table.TransformColumnTypes(Data1,{{"Column1", type text}, {"Column2", type text}}),
date = #"Changed Type"{1}[Column2],
time=#"Changed Type"{0}[Column2],
datetime=DateTime.FromText(date&" "&time)
	in
	    datetime

在PQ中进行一些删减操作,

得到最终想要的结果,

只要网站上的时间是准确的,那我就可以一直得到巴黎的当地,数据集的最终刷新时间啦。

再上传到POWER BI SERVICE上时,

好吧,网站的时间还是有一秒的延迟哦。

不过,经过一番折腾,总算是解决了这个TimeZone的问题,开心。