【问题标题】:Timezone-aware queries in Azure Data ExplorerAzure 数据资源管理器中的时区感知查询
【发布时间】:2020-05-20 08:27:16
【问题描述】:

我使用 Azure 数据资源管理器来存储温度传感器值。时间戳采用 UTC。我想按天汇总过去 7 天的这些值。不过,我想使用这些值来自的本地时间,并按本地时间的时间戳聚合(例如,午夜将在 00:00+2h 和 22:00UTC)。如何使用 ADX 中的 Kusto 查询语言执行此操作?

【问题讨论】:

标签: timezone timezone-offset azure-data-explorer timestamp-with-timezone


【解决方案1】:

例如如果您想提供时区 UTC+1,您可以通过以下方式扩展您的 Kusto 查询:

| extend Timestamp = Timestamp + 3600s

您的时间范围过滤器仍需要以 UTC 格式提供。

【讨论】:

    【解决方案2】:

    偏移量有效,但如果您关心夏令时并有一个非常通用的解决方案,则不能简单地使用固定的时区偏移量。如果您正在做一些定期生成报告并且时区必须正确的事情,请继续阅读。

    感觉有点像 hack,但我们实现这些目标的方法是创建一个包含如下列的时区表:

    BeginOfDay: datetime(2020-01-01 00:00:00)
    Timezone: "Africa/Addis_Ababa"
    UTCStart: datetime(2020-01-01 00:00:00)-3h
    UTCEnd: datetime(2020-01-02 00:00:00)-3h
    

    每个时区和感兴趣日期的组合都应该有一行。我们填充了大约十年后的未来。如果您担心存储空间或速度,您只需要包含您关心的日期范围和时区,但即使使用“所有内容”,它也不是一个很大的表格。

    每一行都包含“日”BeginOfDay,它始终是午夜,相当于“2020 年 1 月 1 日”,然后是当地一天的开始和结束,以 UTC 时间表示。当然,我们编写了一个程序来生成表格的内容。

    之后,您可以执行以下操作:

    let TimezoneDay = datatable (BeginOfDay:datetime, Timezone:string, UTCStart:datetime, UTCEnd:datetime)
        [datetime(2020-01-01), "Africa/Addis_Ababa", datetime(2019-12-31 21:00:00), datetime(2020-01-01 21:00:00), 
         datetime(2020-01-02), "Africa/Addis_Ababa", datetime(2020-01-01 21:00:00), datetime(2020-01-02 21:00:00), 
         datetime(2020-01-03), "Africa/Addis_Ababa", datetime(2020-01-02 21:00:00), datetime(2020-01-03 21:00:00)
         ];
    let TemperatureEvents = datatable (Timestamp:datetime, Device:string, Temperature:real) 
        [datetime(2020-01-01 05:00:00), "Device 1", 10.5,
         datetime(2020-01-01 07:00:00), "Device 1", 30.5,
         datetime(2020-01-02 01:50:00), "Device 1", 24.0,
         datetime(2020-01-02 20:00:00), "Device 1", 20.5,
         datetime(2020-01-02 23:50:00), "Device 1", 19.5,
         datetime(2020-01-01 10:20:00), "Device 2", 0.5
        ];
    TimezoneDay
    | where Timezone == "Africa/Addis_Ababa"
    // Use a dummy column to emulate a cross join
    | extend dummy=1
    | join kind=inner (TemperatureEvents | extend dummy = 1) on dummy
    // Filter values into local time
    | where Timestamp between (UTCStart .. UTCEnd)
    | summarize AverageTemp=avg(Temperature) by BeginOfDay, Timezone, Device
    

    如果您有一个大型数据集,交叉连接可能会有点贵,但这是一个起点 - 您也可以进行时间窗口连接以限制您考虑的每一天的事件数量。

    【讨论】:

      【解决方案3】:

      Azure 数据资源管理器没有任何用于在时区之间转换的内置函数。

      The documentation推荐:

      ...如果需要将时区值保留为数据的一部分,则应使用单独的列(提供相对于 UTC 的偏移信息)。

      因此,您应该存储 两个 值 - 原始的基于 UTC 的时间戳,以便您可以正确排序数据,以及来自本地时区的日期,以便您可以按本地日期汇总。 p>

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 2020-05-31
        相关资源
        最近更新 更多