日志服务提供时间函数、日期函数、时间截断函数、时间间隔函数和时序补全函数,支持对日志中的日期和时间进行格式转换,分组聚合等处理。

说明
  • 日志服务中的日志时间戳精确到秒,所以时间格式只需配置到秒,无需配置毫秒、微秒等信息。
  • 只需为时间字符串中的时间部分配置时间格式,其他内容(例如时区)无需配置。
  • 日志服务中的每条日志都包含保留字段__time__,该字段的值为Unix时间戳类型,例如1592374067,代表2020-06-17 14:07:47。

日期函数

函数名称 说明 示例
current_date 返回当前日期。
  • 返回值格式:YYYY-MM-DD,例如2021-01-12。
  • 返回值类型:DATE
* | select current_date
current_time 返回当前时间。
  • 返回值格式:HH:MM:SS.Ms Time zone,例如01:14:51.967 Asia/Shanghai。
  • 返回值类型:TIME
* | select current_time
current_timestamp 返回当前日期和时间。
  • 返回值格式:YYYY-MM-DD HH:MM:SS.Ms Time zone,例如2021-01-12 17:16:09.035 Asia/Shanghai。
  • 返回值类型:TIMESTAMP
* | select current_timestamp
current_timezone() 返回当前时区。

返回值类型:VARCHAR,例如Asia/Shanghai。

* | select current_timezone()
localtime 返回本地时间。
  • 返回值格式:HH:MM:SS.Ms
  • 返回值类型:TIME
* | select localtime
localtimestamp 返回本地的日期和时间。
  • 返回值格式:YYYY-MM-DD HH:MM:SS.Ms
  • 返回值类型:TIMESTAMP
* | select localtimestamp
now() 返回当前日期和时间,等同于current_timestamp函数。
  • 返回值格式:YYYY-MM-DD HH:MM:SS.Ms Time zone
  • 返回值类型:TIMESTAMP
* | select now()
from_iso8601_timestamp(ISO8601) 把ISO8601格式的日期时间表达式转化为具有时区的Timestamp类型的日期时间表达式。
  • 返回值格式:YYYY-MM-DD HH:MM:SS.Ms Time zone
  • 返回值类型:TIMESTAMP
* | select from_iso8601_timestamp('2020-05-03T17:30:08')
from_iso8601_date(ISO8601) 把ISO8601格式的日期表达式转化为DATE类型的日期表达式。
  • 返回值格式:YYYY-MM-DD
  • 返回值类型:DATE
* | select from_iso8601_date('2020-05-03')
from_unixtime(Unix时间戳) 把Unix时间戳转化为TIMESTAMP类型的日期时间表达式。
  • 返回值格式:YYYY-MM-DD HH:MM:SS.Ms
  • 返回值类型:TIMESTAMP
* | select from_unixtime(1494985275)
from_unixtime(Unix时间戳,Time zone) 把Unix时间戳转化为具有时区的TIMESTAMP类型的日期时间表达式。
  • 返回值格式:YYYY-MM-DD HH:MM:SS.Ms Time zone
  • 返回值类型:TIMESTAMP
* | select from_unixtime (1494985275,'Asia/Shanghai')
to_unixtime(timestamp) 把TIMESTAMP类型的日期时间表达式转化成Unix时间戳。

返回值类型:LONG。例如1494985500.848。

*| select to_unixtime('2017-05-17 09:45:00.848 Asia/Shanghai')

时间函数

函数名称 说明 示例
date_format(timestamp,format) 把TIMESTAMP类型的日期时间表达式转化为Format格式的日期时间表达式。
* | select date_format (date_parse('2017-05-17 09:45:00','%Y-%m-%d %H:%i:%S'), '%Y-%m-%d')
date_parse(string,format) 以Format形式表示字符串,再转化成TIMESTAMP类型的日期时间表达式。Format说明如下表所示。
* | select date_format (date_parse(time,'%Y-%m-%d %H:%i:%S'), '%Y-%m-%d')
表 1. Format说明
format 说明
%a 星期的缩写。例如Sun、Sat。
%b 月份的缩写。例如Jan、Dec。
%c 月份。数值类型,取值范围为1~12。
%D 每月的第几天。需加上后缀,例如0th、1st、2nd、3rd。
%d 每月的第几天。十进制格式,取值范围为01~31。
%e 每月的第几天。十进制格式,取值范围为1~31。
%H 小时,24小时制。
%h 小时,12小时制。
%I 小时,12小时制。
%i 分钟。数值类型,取值范围为00~59。
%j 每年的第几天。取值范围为001~366。
%k 小时。取值范围为0~23。
%l 小时。取值范围为1~12。
%M 月份的英文表达,例如January、December。
%m 月份。数值格式,取值范围为01~12。
%p AM、PM。
%r 时间。12小时制,格式为hh:mm:ss AM/PM
%S 秒。取值范围为00~59。
%s 秒。取值范围为00~59。
%T 时间。24小时制,格式为hh:mm:ss
%V 每年的第几周,星期日是一周的第一天。取值范围为01~53。
%v 每年的第几周,星期一是一周的第一天。取值范围为01~53。
%W 星期几的名称。例如Sunday、Saturday。
%w 一周的第几天,星期日为第0天。
%Y 4位数的年份。例如2020。
%y 2位数的年份。例如20
%% %的转义字符。

时间截断函数

date_trunc()函数根据您指定的日期时间部分截断日期时间表达式,支持按照秒、分钟,小时、日、月、年对齐。该函数常用于需要按照时间进行统计分析的场景。
  • 函数语法
    date_trunc('unit',x)
  • 参数说明
    x为日期时间表达式(例如2021-01-12 03:04:05.000、1610350836)或时间字段(例如__time__),unit的取值为second、minute、hour、day、week、month、quarter或year。具体示例如下表所示:
    示例 转化结果 说明
    * | select date_trunc('second', 2021-01-12 03:04:05.000) 2021-01-12 03:04:05.000 不涉及
    * | select date_trunc('minute', 2021-01-12 03:04:05.000) 2021-01-12 03:04:00.000 不涉及
    * | select date_trunc('hour', 2021-01-12 03:04:05.000) 2021-01-12 03:00:00.000 不涉及
    * | select date_trunc('day', 2021-01-12 03:04:05.000) 2021-01-12 00:00:00.000 返回指定日期的零点。
    * | select date_trunc('week', 2021-01-12 03:04:05.000) 2021-01-11 00:00:00.000 返回指定周的周一零点。
    * | select date_trunc('month', 2021-01-12 03:04:05.000) 2021-01-01 00:00:00.000 返回指定月份的第一天零点。
    * | select date_trunc('quarter', 2021-01-11 03:04:05.000) 2021-01-01 00:00:00.000 返回指定季度的第一天零点。
    * | select date_trunc('year', 2021-01-11 03:04:05.000) 2021-01-01 00:00:00.000 返回本年度第一天零点。
  • 查询和分析示例

    按照每分钟的时间粒度计算请求时间的平均值,并按照时间进行分组和排序。

    * | select  date_trunc('minute' ,  __time__)  as time,
           truncate (avg(request_time) ) as avg_time ,
           current_date as date
           group by  time
           order by time  desc 
           limit 100

    date_trunc('unit',x)函数只能按照固定时间间隔统计。如果您需要按照灵活的时间维度统计(例如统计每5分钟的数据),请使用数学取模方法进行分组,例如:

    * | select count(1) as pv,  __time__ - __time__ %300 as time group by time limit 100

    上述语句中的%300表示按照5分钟进行取模对齐。

时间间隔函数

时间间隔函数用来执行时间段相关的运算,例如在日期中添加或减去指定的时间间隔、计算两个日期之间的时间。
函数名 说明 示例
date_add(unit, N,timstamp) timestamp上加上N个时间单位(unit)。

如果要执行减法,配置N为负值。

*| select date_add('day', -7, '2018-08-09 00:00:00')
表示返回2018年8月9号7天前的日期和时间,即2018-08-02 00:00:00.000。
date_diff(unit, timestamp1, timestamp2) 返回两个时间表达式之间的时间差值,例如计算timestamp1timestamp2之间相差几个时间单位(unit)。
*| select date_diff('day', '2018-08-02 00:00:00', '2018-08-09 00:00:00')
unit取值如下:
unit 说明
millisecond 毫秒
second
minute 分钟
hour 小时
day
week
month
quarter 季度
year

时序补全函数

time_series()函数用于补全您查询时间窗口内缺失的数据。
注意 time_series()函数必须搭配GROUP BY语法和ORDER BY语法使用,且ORDER BY语法不支持desc排序方式。
  • 函数格式
    time_series(time_column, window, format, padding_data)
  • 参数说明
    参数 说明
    time_column 时间列(KEY),例如__time__

    该列的值可以为LONG类型或TIMESTAMP类型的日期时间表达式。

    window 窗口大小,单位为s(秒)、m(分)、h(小时)、d(天)。例如2h、5m、3d。
    format 返回结果为format时间格式。
    padding_data 补全的内容,包括:
    • 0:将缺失的值设置为0。
    • null:将缺失的值设置为null。
    • last:将缺失的值设置了上一个时间点对应的值。
    • next:将缺失的值设置了下一个时间点对应的值。
    • avg:将缺失的值设置为前后两个时间点的平均值。
  • 示例

    按照两个小时的时间粒度进行数据补全,查询和分析语句如下:

    * | select time_series(__time__, '2h', '%Y-%m-%d %H:%i:%s', '0')  as time, count(*) as num from log group by time order by time                        
    时间补全函数示例图