Powerbi 电源查询:日期时区操作
我正在基于SQL Server的表用户中的数据构建Power BI报告,该表用户中包含类型为DateTypeOffset(7)的列CreatedDate。 我正在寻找等效于.NET[TimeZoneInfo.FindSystemTimeZoneById]的电源查询。我的报表数据有一个时区信息,它存储为标准ID(如太平洋标准时间),我需要将DateTimeOffset列中的值转换为上面提到的时区,这是我在C#中的方法: 这使我的设置中存储的时区时间与UserCreatedDateTime的UTC之间存在差异。对于用户表中的所有行,我只执行这行代码一次,因为上面代码的目的是找出当前偏移量,同时考虑到时区的特性,如DaylightSave 现在我可以简单地将偏移量(可以是正的,也可以是负的)添加到我的User.CreateDateTime列中的每个值上,在C中,我使用[DateTimeOffset.ToOffset]来实现这一点:Powerbi 电源查询:日期时区操作,powerbi,powerquery,Powerbi,Powerquery,我正在基于SQL Server的表用户中的数据构建Power BI报告,该表用户中包含类型为DateTypeOffset(7)的列CreatedDate。 我正在寻找等效于.NET[TimeZoneInfo.FindSystemTimeZoneById]的电源查询。我的报表数据有一个时区信息,它存储为标准ID(如太平洋标准时间),我需要将DateTimeOffset列中的值转换为上面提到的时区,这是我在C#中的方法: 这使我的设置中存储的时区时间与UserCreatedDateTime的UTC之
DateTimeOffset convertedOffset = UserCreatedDateTime.ToOffset(timeZoneOffsetSpan)
因此,我需要能够在我的Power BI报告中进行相同的转换,但我找不到任何Power查询函数可以像[TimeZoneInfo.FindSystemTimeZoneById]那样进行转换,如果该函数存在,它将覆盖我的第一行C代码,然后我需要找到与[TimeZoneInfo.FindSystemTimeZoneById]等价的函数。[DateTimeZone.SwitchZone]可能是我需要的,但我首先需要知道与我的时区对应的偏移量,然后我才能将该偏移量作为第二个和第三个参数提供给该函数
所以,为了最终确定,我需要[TimeZoneInfo.FindSystemTimeZoneById]的电源BI模拟。
有人能帮忙吗?您可以在数据模型中添加一个表,其中包含时区ID和时区偏移的列。在主查询中,您可以联接此表,然后创建一个计算,以便在新列中添加或减去偏移量。然后,移除连接的柱 看这里
或者您可以使用内置的M。您可以利用TSQL的
在时区
功能,为每个时区创建一个每天的偏移量表(以分钟为单位),并将结果表导入PowerBI,这样您就可以在基准时间中添加/减去相关偏移量
如果我处于OP的情况,我会将所有时间导入(转换)到UTC,然后在PowerBI中添加偏移量,具体取决于您要显示的时区。(可能使用方法?)
下例给出了澳大利亚时区相对于UTC的偏移量表
如果我的目标表是UTC,并且我想在PowerBI中更改时间,我只需将特定偏移量添加到我的时间中
+------------+-----------+----------+----------+----------+
| TargetDate | QLDOffset | NTOffset | SAOffset | WAOffset |
+------------+-----------+----------+----------+----------+
| 2018-04-02 | -600 | -570 | -570 | -480 |
| 2018-04-01 | -600 | -570 | -570 | -480 |
| 2018-03-31 | -600 | -570 | -630 | -480 |
| 2018-03-30 | -600 | -570 | -630 | -480 |
+------------+-----------+----------+----------+----------+
您可以看到SA的偏移量在4月1日发生变化
WITH MostDays AS ( --MostDays is a table of 10 years worth of dates going back from today.
SELECT Today = CAST(DATEADD(DAY, -days, GETUTCDATE()) AS DATETIMEOFFSET)
FROM (SELECT TOP 3650 Days = ROW_NUMBER() OVER (ORDER BY message_id ) -- this will give a rolling window of 10 years
FROM sys.messages
)x
)
-- This section takes the datetime from above, and calculates how many minutes difference there is between each timezone for each date.
Select TargetDate=CAST(Today AS DATE)
,QLDOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'E. Australia Standard TIME' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
,NTOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'AUS Central Standard Time' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
,SAOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'Cen. Australia Standard TIME' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
,WAOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'W. Australia Standard TIME' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
FROM MostDays
显然,如果你对日期或时区没有限制,表格会变得相当大如果我有带区域偏移的“自制”表格,那么我的报告每年会有2次错误(我负担不起),这是因为日光节约,所以,当我们进入DST和退出DST时,不应该使用硬编码偏移量——这是一种有缺陷的方法,因为偏移量每年至少会出错2次。仅知道偏移量无法计算时区,但如果时区已知,则可以计算偏移量(此处详细说明)。至于DateTimeZone函数——正如我在最初的问题中所展示的,它们没有帮助。不幸的是,我们在Power BI中没有一个datetime格式,它可以在本地时间中格式化datetimeoffset。截至2019年3月,DateTimeOffset仅显示在Power BI中,偏移部分隐藏
WITH MostDays AS ( --MostDays is a table of 10 years worth of dates going back from today.
SELECT Today = CAST(DATEADD(DAY, -days, GETUTCDATE()) AS DATETIMEOFFSET)
FROM (SELECT TOP 3650 Days = ROW_NUMBER() OVER (ORDER BY message_id ) -- this will give a rolling window of 10 years
FROM sys.messages
)x
)
-- This section takes the datetime from above, and calculates how many minutes difference there is between each timezone for each date.
Select TargetDate=CAST(Today AS DATE)
,QLDOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'E. Australia Standard TIME' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
,NTOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'AUS Central Standard Time' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
,SAOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'Cen. Australia Standard TIME' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
,WAOffset = DATEDIFF(minute,CAST(Today at TIME ZONE 'UTC' AT TIME ZONE 'W. Australia Standard TIME' AS DateTime),CAST(Today at TIME ZONE 'UTC' AS DATETIME))
FROM MostDays