# SPL文档(常用函数)
## 日期类函数
### 时间或日期截取函数(to)——返回非日期
函数 | 用途 | 举例 | 结果
---|---|---|---
toYear()| 取日期或时间日期的年份 |toYear(toDateTime('2018-12-11 11:12:13')
toYear(toDate('2018-12-11'))|2018
2018
toMonth()| 取日期或时间日期的月份 |toMonth(toDateTime('2018-12-11 11:12:13'))
toMonth(toDate('2018-12-11'))|12
12
toDayOfMonth()| 取日期或时间日期的天(1-31|toMonth(toDayOfMonth('2018-12-11 11:12:13'))
toMonth(toDayOfMonth('2018-12-11'))|11
11
toDayOfWeek()| 取日期或时间日期的星期(星期一为1,星期日为7) |toDayOfWeek(toDateTime('2018-12-11 11:12:13'))
toDayOfWeek(toDate('2018-12-11'))|2
2
toHour()| 取时间日期的小时 |toHour(toDateTime('2018-12-11 11:12:13'))|11
toMinute()| 取时间日期的分钟 |toMinute(toDateTime('2018-12-11 11:12:13'))|12
toSecond()| 取时间日期的秒 |toSecond(toDateTime('2018-12-11 11:12:13'))|13
toMonday()| 取时间日期最近的周一(返回日期) |toMonday(toDate('2018-12-11'))
toMonday(toDateTime('2018-12-11 11:12:13'))|2018-12-10
2018-12-10
toTime()| 将时间日期的日期固定到某一天,保留原始时间 |toTime(toDateTime('2018-12-11 11:12:13'))|1970-01-02 11:12:13
toDateTime()| 将时间戳转换为时间类型 |toDateTime(at_timestamp/1000)|
### 时间或日期截取函数(toStartOf)——返回日期
函数 | 用途 | 举例 | 结果
---|---|---|---
toStartOfMonth()| 取日期或时间日期的月份的第一天 |toStartOfMonth(toDateTime('2018-12-11 11:12:13'))
toStartOfMonth(toDate('2018-12-11'))|2018-12-01
2018-12-01
toStartOfQuarter()| 取日期或时间日期的季度的第一天 |toStartOfQuarter(toDateTime('2018-12-11 11:12:13'))
toStartOfQuarter(toDate('2018-12-11'))|2018-10-01
2018-10-01
toStartOfYear()| 取日期或时间日期的年份的第一天 |toStartOfYear(toDateTime('2018-12-11 11:12:13'))
toStartOfYear(toDate('2018-12-11'))|2018-01-01
2018-01-01
toStartOfMinute()| 截取时间日期到分钟(之后归零) |toStartOfMinute(toDateTime('2018-12-11 11:12:13'))|2018-12-11 11:12:00
toStartOfFiveMinute()| 截取时间日期到最近的5的倍数分钟(之后归零) |toStartOfFiveMinute(toDateTime('2018-12-11 11:12:13'))|2018-12-11 11:10:00
toStartOfFifteenMinutes()| 截取时间日期到最近的15的倍数分钟(之后归零) |toStartOfFifteenMinutes(toDateTime('2018-12-11 11:12:13'))|2018-12-11 11:00:00
toStartOfHour()| 截取时间日期到小时(之后归零) |toStartOfHour(toDateTime('2018-12-11 11:12:13'))|2018-12-11 11:00:00
toStartOfDay()| 截取时间日期到天(之后归零) |toStartOfDay(toDateTime('2018-12-11 11:12:13'))|2018-12-11 00:00:00
timeSlot()| 将时间日期中,分钟大于等于30的归于30,分钟数小于30的归为00|timeSlot(toDateTime('2018-12-11 11:33:13'))
timeSlot(toDateTime('2018-12-11 11:33:13'))|2018-12-11 11:00:00
2018-12-11 11:30:00
### 日期或时间日期生成函数
函数 | 用途 | 举例 | 结果
---|---|---|---
now()| 生成当前时间日期 |now()|2018-12-13 10:10:12
today()| 生成今天的日期 |today()|2018-12-13
yesterday()| 生成昨天的日期 |yesterday()|2018-12-12
## 类型转化类函数
### 精度保留(非四舍五入)
函数 | 用途 | 举例 | 结果
---|---|---|---
toDecimal32('whdwjfew',8)| 将数值型或者含有非数字的字符串进行精度保留 |toDecimal32(23.12291, 3)
toDecimal32('_23.12291', 3)|23.122
0.000
toDecimal64('whdwjfew',8)| 将数值型或者含有非数字的字符串进行精度保留 |toDecimal64(23.12291, 3)
toDecimal64('_23.12291', 3)|23.122
0.000
|toDecimal128('whdwjfew',8)| 将数值型或者含有非数字的字符串进行精度保留 |toDecimal128(23.12291, 3)
toDecimal128('_23.12291', 3)|23.122
0.000
### 字符串转化为整数
函数 | 用途 | 举例 | 结果
---|---|---|---
toUInt8OrZero()| 将无符号整数字符型转化为整数型,否则返回0|toUInt8OrZero('123')
toUInt8OrZero('123.12')|123
0
toInt8OrZero()| 将整数字符型转化为整数型,否则返回0|toInt8OrZero('123')
toInt8OrZero('-123')|123
-123
toFloat32OrZero()| 将数值字符串型转化为数值型,注意:从toFloat32OrZero开始,丢32的没有对应的函数 |toFloat32OrZero('-123')
toFloat32OrZero(‘123.123’)|-123
123.123
### 日期与时间日期转化
### 字符串转化为整数
函数 | 用途 | 举例 | 结果
---|---|---|---
toDate()| 将字符型日期转化为日期型 |toDate('2018-12-24')|2018-12-24
toDateTime()| 将字符型时间日期转化为时间日期型 |toDateTime('2018-12-24 10:10:00')|2018-12-24 10:10:00
### 转化为字符型
函数 | 用途 | 举例 | 结果
---|---|---|---
toString()| 将数值型、字符型、日期等转化为字符型 |toString('2018-12-24')
toString('123')|2018-12-24
123
### 查看数据类型
函数 | 用途 | 举例 | 结果
---|---|---|---
toTypeName()| 返回数据的类型 |toTypeName(toString('123'))
toTypeName(toDate('2018-12-24'))|String
Date
## 字符串操作
### 基本字符串操作
函数 | 用途 | 举例 | 结果
---|---|---|---
empty()| 判断字符串是空为1,否则为0|empty('')
empty('123a')|1
0
notEmpty()| 判断字符串是非空为1,否则为0|notEmpty('')
notEmpty('123a')|0
1
length()| 返回字符串的长度 |length('')
length('123a')|0
4
lower()| 将字符串转为小写 |lower('aBc')|abc
upper()| 将字符串转为大写 |upper('aBc')|ABC
reverse()| 将字符串反转 |reverse('abc')|cba
substring(s, offset, length)| 字符串截取 |substring('123abcABC', 2, 3)|23a
appendTrailingCharIfAbsent(s, c)| 如果字符串s非空,则将s后追加一个字符c(s最后一个字符与c不同),否则不处理 |appendTrailingCharIfAbsent('123abc', 'b')
appendTrailingCharIfAbsent('123abc', 'c')|123abcb
123abc
### 字符串查找
函数 | 用途 | 举例 | 结果
---|---|---|---
match(haystack,pattern)| 字符串正则匹配,返回0或1|match('avhsca','vh’)|1
extract(haystack,pattern)| 返回匹配到的第一个子串 |extract('iioomAj12123124OOBJB', '\\d+')| 返回12123124
extractAll(haystack,pattern)| 返回匹配到的所有子串,输出列表 |extractAll('iioomAj12123124OOBJ123B', '\\d+')|[12123124,123]
like(haystack,pattern)| 匹配到的数据返回1,否则返回0|like('avhsca','%vh%')
like('avhsca','%vabjh%')|1
0
notLike(haystack, pattern)| 与like()函数相反 |notLike('avhsca','%vh%')
notLike('avhsca','%vabjh%')|0
1
### 字符串替换
函数 | 用途 | 举例 | 结果
---|---|---|---
replaceOne(haystack,pattern,replacement)| 替换第一个匹配到的pattern|replaceOne('asd123cbbj464sd', 'sd', '-')|a-123cbbj464sd
replaceAll(haystack,pattern,replacement)| 替换所有匹配到的pattern|replaceOne('asd123cbbj464sd', 'sd', '-')|a-123cbbj464-
replaceRegexpOne(haystack, pattern, replacement)| 正则匹配替换第一个匹配到的pattern|replaceRegexpOne('Hello, World!', 'o', '- ')|Hell- , World!
replaceRegexpAll(haystack,pattern,replacement)| 正则匹配替换所有匹配到的pattern|replaceRegexpAll('Hello, World!', '^', 'here: ')
replaceRegexpAll('Hello, World!', 'o', '-- ')|here: Hello, World!
Hell-- , W-- rld!
### 字符串分割
函数 | 用途 | 举例 | 结果
---|---|---|---
splitByChar(separator, s)| 以单个字符分割字符串 |splitByChar('-', 'qw-asaf-asfqw-2312-asd')|['qw','asaf','asfqw','2312','asd']
splitByString(separator, s)| 以单个或多个字符分割字符串 |splitByString('-', 'qw-asaf-asfqw-2312-asd')
splitByString('-a', 'qw-asaf-asfqw-2312-asd')|['qw','asaf','asfqw','2312','asd']
['qw','saf','sfqw-2312','sd']
### 字符串拼接
函数 | 用途 | 举例 | 结果
---|---|---|---
concat(s1,s2,...)| 将字符串拼接 |concat('123', 'abc', 'ABC')|123abcABC
## 条件语句
函数 | 用途 | 举例 | 结果
---|---|---|---
if(cond,then,else)| 条件输出 |if(1 > 2, '正确', '错误')| 错误
multiIf(cond_1, then_1, cond_2, then_2...else)| 多条件输出 |multiIf(1 > 2, '正确', 2 < 0, '正确', '错误')| 错误
case field when 1 then 11 when 2 then 22 else 33 end| 多条件输出 |case method when 'GET' then 'GET1' when 'POST' then 'POST1' else 0 end|
## 数学函数
函数 | 用途 | 举例 | 结果
---|---|---|---
e()| 返回e的值 |e()|2.718281828459045
pi()| 返回pi的值 |pi()|3.141592653589793
exp(x)| 返回e的x次方 |exp(1)|2.718281828459045
exp2(x)| 返回2的x次方 |exp2(2)|4
exp10(x)| 返回10的x次方 |exp10(1)|10
log(x)| 返回log以e为底的对数值 |log(e())|1
log2(x)| 返回log以2为底的对数值 |log2(2)|1
log10(x)| 返回log以10为底的对数值 |log10(100)|2
sqrt(x)| 对x开平方 |sqrt(4)|2
cbrt(x)| 对x开立方 |cbrt(8)|2
pow(x, y)| 返回x的y次方 |pow(2, 3)|8
## 舍入函数
函数 | 用途 | 举例 | 结果
---|---|---|---
floor(x[, N])| 向下取数 |floor(123.883, 1)
floor(123.883, -1)|123.8
120
ceil(x[, N])| 向上取数 |ceil(123.883, 1)
ceil(123.883, -1)|123.9
130
round(x[, N])| 四舍五入 |round(123.883, 1)
round(123.883, -1)|123.9
120
## LIMIT操作
函数 | 用途 | 举例 | 结果
---|---|---|---
LIMIT N| 查询N条数据,一般跟ORDER BY连用 |ORDER BY hit DESC LIMIT 10| 按照hit列降排取前10|
LIMIT N BY Clause| 按照Clause列查询N条数据,一般跟ORDER BY连用 |SELECT date,domain, count(1) AS hit from db.tb where...
GROUP BY date,domain,ORDER BY hit DESC LIMIT 10 BY date| 取每天TOP10的域名
## json数据处理
函数 | 用途
---|---
visitParamExtractUInt(params, name)| 将名为“name”的字段的值解析成UInt64
visitParamExtractInt(params, name)| 与visitParamExtractUInt相同,但返回Int64。
visitParamExtractFloat(params, name)| 与visitParamExtractUInt相同,但返回Float64
visitParamExtractRaw(params, name)| 返回字段的值,包含空格符
visitParamExtractString(params, name)| 使用双引号解析字符串。这个值没有进行转义。如果转义失败,它将返回一个空白字符串 | visitParamExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
## url函数
函数 | 用途 |
---|---
protocol| 返回URL的协议 |
domain| 获取域名|
domainWithoutWWW| 返回域名并删除第一个'www.'
topLevelDomain| 返回顶级域名。例如:.ru
path| 返回URL路径
pathFull| 返回URL路径,包括请求参数和fragment。例如:/top/news.html?page=2#comments
queryString| 返回请求参数。例如:page=1&lr=213,请求参数不包含问号已经#以及#之后所有的内容
extractURLParameter(URL, name)| 返回URL请求参数中名称为‘name’的参数。如果不存在则返回一个空字符串。如果存在多个匹配项则返回第一个相匹配的。
extractURLParameters(URL)| 返回一个数组,其中以name=value的字符串形式返回url的所有请求参数。
decodeURLComponent(URL)| 返回已经解码的URL
## 数组函数
函数 | 用途
---|---
arrayElement(arr, n), operator arr[n]| 从数组arr中获取索引为“n”的元素 |
length| 返回数组中的元素个数。 结果类型是UInt64
arrayConcat| 合并参数中传递的所有数组
## Nullable处理函数
函数 | 用途 | 用法
---|---|---
isNull| 判断参数是否为NULL|isNull(x)
isNotNull| 判断参数是否不为NULL|isNotNull(x)
ifNull| 如果第一个参数为“NULL”,则返回第二个参数的值 |ifNull(x,alt)
## 常用语法
### 取最近10分钟内的数据
```
select col1 from table where at_timestamp between (toUnixTimestamp(now())-600)*1000 and toUnixTimestamp(now())*1000
select col1 from table where _at_timestamp_ between toDateTime(now()-300) and now()
```
### 趋势图时间粒度
```
select toDateTime((at_timestamp - at_timestamp%60000)/1000) as ttime,count(1) from ecs where at_timestamp between $time$ and $time$ group by ttime order by ttime desc
# 60000 是1min
select toStartOfInterval(_at_timestamp_,INTERVAL 5 minute,'Asia/Shanghai') as ttime,count(1) from ecs where _at_timestamp_ between ${begin_time} and ${end_time} group by ttime order by ttime desc
```
### 时区转换
```
select toDateTime(now(),'UTC');
```
### 行数据转列
```
select arrayJoin(splitByString('}, {',replaceRegexpAll('[{"desc": "desc1"}, {"desc": "desc2"}]','\\[\\{|\\}\\]','')))
```
## 更多用法
[更多用法](https://clickhouse.tech/docs/zh/ "更多用法")