Power Query:日期时区操作

Posted

技术标签:

【中文标题】Power Query:日期时区操作【英文标题】:Power Query: Date Time Zone operations 【发布时间】:2016-03-10 21:09:50 【问题描述】:

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

TimeSpan timeZoneOffsetSpan = TimeZoneInfo.FindSystemTimeZoneById(settings.TimeZ​one).GetUtcOffset(UserCreatedDateTime);

这给了我存储在我的设置中的时区时间和 UserCreatedDateTime 的 UTC 时间之间的差异。我只对用户表中的所有行执行该行代码一次,因为上面代码的目的是找出当前偏移量,同时考虑到 DayLightSaving 等时区的功能。

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

DateTimeOffset convertedOffset = UserCreatedDateTime.ToOffset(timeZoneOffsetSpan)

所以我需要能够在我的 Power BI 报告中进行相同的转换,但我找不到任何可以与 [TimeZoneInfo.FindSystemTimeZoneById] 执行相同操作的 Power Query 函数,如果该函数存在,它将覆盖我的第一行的 C# 代码,然后我需要找到 [TimeZoneInfo.FindSystemTimeZoneById] 的等价物。 [DateTimeZone.SwitchZone] 可能是我需要的,但我首先需要知道与我的时区相对应的偏移量,然后我才能将该偏移量作为第二个和第三个参数提供给该函数。

所以,为了最终确定,我需要 [TimeZoneInfo.FindSystemTimeZoneById] 的 Power BI 模拟。 有人可以帮忙吗?

【问题讨论】:

很遗憾,我们在 Power BI 中没有日期时间 format 来格式化 local 时间的 datetimeoffset。截至 2019 年 3 月,日期时间偏移量仅显示在 Power BI 中,偏移量部分隐藏 【参考方案1】:

您可以向数据模型添加一个表,其中包含时区 ID 和时区偏移列。在您的主查询中,您可以加入此表,然后创建一个计算以将偏移量添加或减去新列。之后,删除连接的列。

请看这里How can I perform the equivalent of AddHours to a DateTime in Power Query?

或者您可以使用 M 中内置的 DateTimeZone functions。

【讨论】:

如果我有带区域偏移的“本土”表,那么我的报告每年会出错 2 次(我负担不起),这是因为夏令时,所以,一个不应该使用硬编码的偏移量 - 这是一种错误的方法,因为该偏移量每年至少会出错 2 次 - 当我们进入 DST 和退出它时。时区不能仅通过知道偏移量来计算,但如果时区已知,则可以计算偏移量(详细信息在此处***.com/tags/timezone/info)。至于 DateTimeZone 函数 - 正如我在最初的问题中所展示的那样,它们没有帮助。【参考方案2】:

您可以利用 TSQL 的AT TIME ZONE 功能为每个时区的每一天创建一个偏移量表(以分钟为单位),并将生成的表导入 PowerBI,以便您可以添加/减去相关偏移量到你的基准时间。

如果我处于 OP 的情况,我会一直导入(转换)为 UTC,然后在 PowerBI 中添加偏移量,具体取决于您要显示的时区。 (也许使用this 方法?)

下面的示例给出了澳大利亚时区相对于 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 

如果您对日期或时区没有限制,显然表格会变得很大

【讨论】:

以上是关于Power Query:日期时区操作的主要内容,如果未能解决你的问题,请参考以下文章

在 Power Bi 中使用 Power Query M 的上一周日期

power query 根据两个日期之间的事务日期合并两个表

MS Power Query:从月、日、年创建日期

powerquery不自动转换

具有 Power Query 日期的动态 SQL 查询

SharePoint 列表数据的 Excel Power Query 导入更改日期/时间值