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.TimeZone).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 的上一周日期