Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powerbi 电源查询:日期时区操作_Powerbi_Powerquery - Fatal编程技术网

Powerbi 电源查询:日期时区操作

Powerbi 电源查询:日期时区操作,powerbi,powerquery,Powerbi,Powerquery,我正在基于SQL Server的表用户中的数据构建Power BI报告,该表用户中包含类型为DateTypeOffset(7)的列CreatedDate。 我正在寻找等效于.NET[TimeZoneInfo.FindSystemTimeZoneById]的电源查询。我的报表数据有一个时区信息,它存储为标准ID(如太平洋标准时间),我需要将DateTimeOffset列中的值转换为上面提到的时区,这是我在C#中的方法: 这使我的设置中存储的时区时间与UserCreatedDateTime的UTC之

我正在基于SQL Server的表用户中的数据构建Power BI报告,该表用户中包含类型为DateTypeOffset(7)的列CreatedDate。 我正在寻找等效于.NET[TimeZoneInfo.FindSystemTimeZoneById]的电源查询。我的报表数据有一个时区信息,它存储为标准ID(如太平洋标准时间),我需要将DateTimeOffset列中的值转换为上面提到的时区,这是我在C#中的方法:

这使我的设置中存储的时区时间与UserCreatedDateTime的UTC之间存在差异。对于用户表中的所有行,我只执行这行代码一次,因为上面代码的目的是找出当前偏移量,同时考虑到时区的特性,如DaylightSave

现在我可以简单地将偏移量(可以是正的,也可以是负的)添加到我的User.CreateDateTime列中的每个值上,在C中,我使用[DateTimeOffset.ToOffset]来实现这一点:

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