处理日期时间

处理日期时间,将方便您对日志后续查询与可视化展示。本文向您介绍使用转换函数进行日期时间数据类型转换。

概念解释

SLS SPL语法中的日期时间处理主要涉及三种数据类型:日期时间字符串、日期时间对象和Unix时间戳。

  • 日期时间字符串

    日期时间字符串的主要用途是为了便于展示以及提升用户可读性。SLS SPL语法中的日期时间字符串主要分为两种形式:

    • 带有时区信息的日期时间字符串,如2019-06-02 18:41:26+08:00

    • 不带时区信息的日期时间字符串,如2019-06-02 10:41:26

    带有时区信息的日期时间字符串通过在日期时间后添加额外的时差信息来表达时区:

    • 2019-06-02 18:41:26+08:00表示该时间是8时区下的2019-06-02 18:41:26

    • 2019-06-02 18:41:26-07:00表示该时间是西7时区下的2019-06-02 18:41:26

  • 日期时间对象

    实例化的日期时间,专指Datetime类型的数据。日期时间对象的主要用途是为了便于展示以及提升用户可读性。

  • Unix时间戳

    197011日(UTC/GMT的午夜)开始所经过的秒数。Unix时间戳的主要应用场景有:

    • 表示系统时间。

      日志事件中表示日志产生时间的元字段__time__,表示日志接收时间的字段__receive_time__等,这些字段的值都使用Unix时间戳来表示对应的系统时间,如下例所示。

      __source__:  192.0.2.1
      __tag__:__receive_time__:  1562741899
      __topic__: 
      __time__: 1562731122
    • 时间相关的计算。

      Unix时间戳是从197011日开始所经过的秒数,因此在很多场景下便于直接进行日期时间相关的计算,例如如下示例。

      • 原始日志

        time1: 1562741899
        time2: 1562731122
      • SPL语句

        * | extend time_diff = cast(time1 as BIGINT) - cast(time2 as BIGINT)
      • 查询和分析结果

        time1: 1562741899
        time2: 1562731122
        time_diff: 10777

数据类型转换和转换函数

转换场景

转换函数

日期时间对象和Unix时间戳的相互转换

日期时间对象转为Unix时间戳。

to_unixtime智能转换函数,将日期时间对象或日期时间字符串转换为Unix时间戳。

Unix时间戳转为日期时间对象。

from_unixtime智能转换函数,将Unix时间戳转换成无时区的日期时间对象。

日期时间对象和日期时间字符串的相互转换

日期时间对象转换为日期时间字符串。

date_format智能转换函数,用于将timestamp类型的日期和时间对象转换为指定格式的日期和时间字符串。

日期时间字符串转换为日期时间对象。

date_parse智能转换函数,用于将日期和时间字符串转换为指定格式的timestamp类型的日期和时间对象。

日期时间对象和Unix时间戳的相互转换

  • 处理函数

    • to_unixtime转换函数,将日期时间对象或日期时间字符串转换为Unix时间戳。

    • from_unixtime转换函数,将Unix时间戳转换成带时区的日期时间对象。

  • 场景一:使用to_unixtime转换函数,将不带时区的日期时间对象或日期时间字符串转换为Unix时间戳。

    • 原始日志

      time: 2023-09-21 10:59:37.055
    • SPL语句

      * | extend time=cast(time as TIMESTAMP) | extend new_time=to_unixtime(time)
    • 查询和分析结果

      time: 2023-09-21 10:59:37.055
      new_time:1695293977.055
  • 场景二:使用to_unixtime转换函数,将带时区的日期时间对象或日期时间字符串转换为Unix时间戳。

    • 原始日志

      time: 2024-03-13_16:44:58.800+0800
    • SPL语句

      * | extend new_time=replace(replace(time, '+0800', ''), '_', ' ') | extend new_time = cast(to_unixtime(cast(new_time as TIMESTAMP)) as bigint) - 28800
    • 查询和分析结果

      time:2024-03-13_16:44:58.800+0800
      new_time:1710319499
  • 场景三:使用from_unixtime转换函数,将Unix时间戳转化无时区的timestamp类型的日期和时间。

    • 原始日志

      time:1695191402
    • SPL语句

      * | extend new_time=from_unixtime(cast(time as DOUBLE))
    • 查询和分析结果

      time: 1695191402
      new_time:2023-09-20 06:30:02.000
    • 场景四:使用from_unixtime转换函数,将Unix时间戳转化带时差的timestamp类型的日期和时间。

      • 原始日志

        time:1695191402
      • SPL语句

        * | extend new_time=from_unixtime(cast(time as DOUBLE) + 28800)
      • 查询和分析结果

        time:1695191402
        new_time:2023-09-20 14:30:02.000

日期时间对象和日期时间字符串的相互转换

  • 处理函数

    • date_format函数用于将timestamp类型的日期和时间对象转换为指定格式的日期和时间字符串。

    • date_parse函数用于将日期和时间字符串转换为指定格式的timestamp类型的日期和时间对象。

  • 场景一:使用date_formattimestamp类型的日期和时间对象转换为指定格式的日期时间字符串。

    • 原始日志

      time: 2023-09-21 10:59:37.055
    • SPL语句

      * | extend time=cast(time as TIMESTAMP) | extend new_time=date_format(time, '%H:%i:%s')
    • 查询和分析结果

      time: 2023-09-21 10:59:37.055
      new_time: 10:59:37
  • 场景二:使用date_parse将日期时间字符串转换为指定格式的timestamp类型的日期和时间对象。

    • 原始日志

      time: 2022-10-19 15:46:05
    • SPL语句

      * | extend time=cast(time as varchar) | extend new_time=date_parse(time, '%Y-%m-%d %H:%i:%s')
    • 查询和分析结果

      time: 2022-10-19 15:46:05
      new_time: 2022-10-19 15:46:05.000