日志服务支持时间函数和日期函数,您可以在分析语句中使用本文档中介绍的日期和时间函数。

日期时间类型

  1. unixtime:以int类型表示从1970年1月1日开始的秒数,例如1512374067 表示的时间是Mon Dec 4 15:54:27 CST 2017。日志服务每条日志中内置的时间__time__即这种类型。
  2. timestamp类型:以字符串形式表示时间,例如2017-11-01 13:30:00

日期函数

日志服务支持的常见日期函数如下:

函数名 含义 样例
current_date 当天日期。 latency>100| select current_date
current_time 时:分;秒,毫秒 时区。 latency>100| select current_time
current_timestamp 结合current_date 和current_time的结果。 latency>100| select current_timestamp
current_timezone() 返回时区。 latency>100| select current_timezone()
from_iso8601_timestamp(string) 把iso8601时间转化成带时区的时间。 latency>100| select from_iso8601_timestamp(iso8601)
from_iso8601_date(string) 把iso8601转化成天。 latency>100| select from_iso8601_date(iso8601)
from_unixtime(unixtime) 把unix时间转化为时间戳。 latency>100| select from_unixtime(1494985275)
from_unixtime(unixtime,string) 以string为时区,把unixtime转化成时间戳。 latency>100| select from_unixtime (1494985275,'Asia/Shanghai')
localtime 当前时间。 latency>100| select localtime
localtimestamp 当前时间戳。 latency>100| select localtimestamp
now() 等同于current_timestamp -
to_unixtime(timestamp) timestamp转化成unixtime。 *| select to_unixtime('2017-05-17 09:45:00.848 Asia/Shanghai')

时间函数

MySQL时间格式

日志服务还支持MySQL时间格式,包括%a、%b、%y 等。

函数名 含义 样例
date_format(timestamp, format) 把timestamp转化成以format形式表示。 latency>100| select date_format (date_parse('2017-05-17 09:45:00','%Y-%m-%d %H:%i:%S'), '%Y-%m-%d') group by method
date_parse(string, format) 把string以format格式解析,转化成timestamp。 latency>100|select date_parse('2017-05-17 09:45:00','%Y-%m-%d %H:%i:%S') group by method
表 1. 格式说明
格式 描述
%a 星期缩写 (Sun .. Sat)。
%b 月份缩写 (Jan .. Dec)。
%c 月份,数值类型 (1 .. 12) [4]。
%D 每月的第几天,带上后缀 (0th, 1st, 2nd, 3rd, …)。
%d 每月的第几天 (01 .. 31) [4]。
%e 每月的第几天 (1 .. 31) [4]。
%H 小时 (00 .. 23)。
%h 小时 (01 .. 12)。
%I 小时,12时制 (01 .. 12)。
%i 分钟 (00 .. 59)。
%j 每年的第几天 (001 .. 366)。
%k 小时 (0 .. 23)。
%l 小时 (1 .. 12)。
%M 月份,英文 (January .. Dece。mber)
%m 月份,数值 (01 .. 12) [4]。
%p AM 或 PM。
%r 时间 12小时制,格式为(hh:mm:ss 后跟AM 或 PM)。
%S 秒 (00 .. 59)。
%s 秒 (00 .. 59)。
%T 时间,24时制 (hh:mm:ss)。
%U 每年的第几周(00 .. 53)。
%u 每年的第几周 (00 .. 53)。
%V 每年的第几周 (01 .. 53)。
%v 每年的第几周Week (01 .. 53), where Monday is the first day of the week; used with %x。
%W 星期几的名称 (Sunday .. Saturday)。
%w 一周第几天 (0 .. 6), 星期日为第0天。
%Y 年份。
%y 年份,两位数。
%% %转义字符。
时间段对齐函数

日志服务支持时间段对齐函数,可以按照秒、分钟,小时、日、月、年等对齐。这个函数常用于一些按照时间进行统计的场景。

函数语法

date_trunc(unit, x)

参数

Unit可选的值有(x取2001-08-22 03:04:05.000):

Unit 转化后结果
second 2001-08-22 03:04:05.000
minute 2001-08-22 03:04:00.000
hour 2001-08-22 03:00:00.000
day 2001-08-22 00:00:00.000
week 2001-08-20 00:00:00.000
month 2001-08-01 00:00:00.000
quarter 2001-07-01 00:00:00.000
year 2001-01-01 00:00:00.000

x 可以是一个timestamp类型,也可以是unix time。

date_trunc只能在按照一些固定时间间隔统计,如果我们需要按照灵活的时间维度进行统计,例如统计每5分钟的,这种场景下,我们需要按照数学取模方法进行GROUP BY。

* | SELECT count(1) as pv,  __time__ - __time__% 300 as minute5groupby minute5 limit 100

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

日期函数样例

以下为使用时间格式的一个综合样例。
*|select  date_trunc('minute' ,  __time__)  as t,
       truncate (avg(latency) ) ,
       current_date  
       group by   t
       order by t  desc 
       limit 60