empty | 判断字符串或数组是否为空。空字符返回1,非空字符串返回0。结果类型为UInt8。 | 示例:select [] as arr, empty(arr) 返回:1 |
notEmpty | 判断字符串或数组是否为非空。空字符返回0,非空字符串返回1。结果类型为UInt8。 | 示例:select [] as arr, notEmpty(arr); 返回:0 |
length | 返回字符串的长度(以字节为单位)和数组的长度。结果类型为UInt64。 | 示例:select ['我爱'] as arr, length(arr), length('我爱'); 返回:数组和字符串的长度分别返回1和2。 |
lengthUTF8 | 返回UTF8编码的字符串的长度(以字节为单位)的长度,不能作用于数组。结果类型为UInt64。 | 示例:select lengthUTF8('我爱'); 返回:2 |
char_length, CHAR_LENGTH |
返回UTF8编码的字符串的长度(以字节为单位)的长度,不能作用于数组。结果类型为UInt64。 | 示例:select char_length('我爱'); 返回:2 |
character_length CHARACTER_LENGTH |
返回UTF8编码的字符串的长度(以字节为单位)的长度,不能作用于数组。结果类型为UInt64。 | 示例:select character_length('我爱'); 返回:2 |
lower, lcase | 将字符串中的ASCII拉丁符号转换为小写。 | 示例:select lcase('I Love Beijing'); 返回:i love beijing |
upper, ucase | 将字符串中的ASCII拉丁符号转换为大写 | |
lowerUTF8 | 将包含UTF8编码的字符串转换为小写。 | |
upperUTF8 | 将包含UTF8编码的字符串转换为大写。 |
isValidUTF8 | 如果字节集合时有效的UTF-8编码,则返回1, 否则返回0。 | |
toValidUTF8 | 用"� (U+FFFD) "字符串替换无效的UTF-8编码。返回有效的UTF-8字符串。 | 示例:SELECT toValidUTF8('\x61\xF0\x80\x80\x80b') 返回: a�b |
repeat | 将字符串重复指定的次数。语法:repeat(s, n),s为要重复的字符串,n为重复的次数。如果n<1,则返回空字符串。 | 示例:select repeat('abc',3); 返回:abcabcabc |
reverse | 按照字节序列反转字符串。 | 示例:select reverse('bei'); 返回:ieb |
reverseUTF8 | 按照UTF-8编码反转字符串。 | 示例:select reverseUTF8('北京'); 返回:京北 |
format(pattern, s0, s1, …) | 使用参数中的字符串格式化常量pattern。格式字符串包含用花括号{}括起来的“替换字段”。不在花括号中的所有内容视为文本,该文本按原样输出。如果文字文本中要包含花括号,使用两个{{和}}转义。字段名可以是从零开始的数字或空。 | 示例1:SELECT format('{1} {0} {1}', 'World', 'Hello'); 返回:Hello World Hello 示例2:SELECT format('{} {}', 'Hello', 'World'); 返回:Hello World |
concat | 连接参数中列出的字符串,不带分隔符。语法:concat(s1, s2, ...)。如果任何参数值为NULL,则结果为NULL。 | 示例:SELECT concat('Hello, ', 'World!') ; 返回:Hello, World! |
concatAssumeInjective | 语法:concatAssumeInjective(s1, s2, ...)。 用于连接参数中列出的字符串。与concat的不同之处在于需确保concat(s1, s2, ...) → sn是单射(设f是由集合A到集合B的映射,如果所有x,y∈A,且x≠y,都有f(x)≠f(y),则称f为由A到B的单射。)。这里的单射即不同的参数值总是返回不同的结果。 用于优化GROUP BY。 |
示例: CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog; INSERT INTO key_val VALUES ('Hello, ','World',1), ('Hello, ','World',2), ('Hello, ','World!',3), ('Hello',', World!',2); SELECT * from key_val; 聚合语句: select con, val, lengthUTF8(con) as len from (select concat(key1, key2) as con, sum(value) as val FROM key_val GROUP BY concatAssumeInjective(key1, key2)) ; 返回: ┌─con─────┬─val┬─len─┐ │ Hello, World! │ 3 │ 13 │ │ Hello, World! │ 2 │ 13 │ │ Hello, World │ 3 │ 12 │ └────────┴───┴────┘ |
substring(s, offset, length) mid(s, offset, length) substr(s, offset, length) |
字符串截取, s为源字符串, offset为字节偏移量,length为截取的长度。 Note:字符索引从1开始。 |
示例:select substr('abcd',1,2); 返回:ab |
substringUTF8(s, offset, length) | UTF-8编码的字符串截取。 | |
appendTrailingCharIfAbsent(s, c) | 如果“s”字符串不是空的,并且结尾不包含“c”字符,则在结尾处追加“c”字符。 | 示例:select appendTrailingCharIfAbsent('ab','e'); 返回:abe |
endsWith(s, suffix) | 判断字符串是否以指定后缀结尾。如果字符串以指定后缀结尾,则返回1,否则返回0。 | |
startsWith(str, prefix) | 判断字符串是否以指定前缀开头。如果字符串以指定前缀开头,则返回1,否则返回0。 | 示例:SELECT startsWith('Hello, world!', 'He'); 返回:1 |
trim | 从字符串的开头或结尾删除所有指定的字符。默认情况下, 从字符串的两端删除所有连续出现的空格。 语法:trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string) 。 参数:
|
示例:select trim(BOTH '<> ' from ' <ClickHouse >') as trim_str; 返回:ClickHouse |
trimLeft | 从字符串开头删除所有连续出现的空格。它不会删除其他种类的空白字符(如制表符等)。 | |
trimLeft | 从字符串结尾删除所有连续出现的空格。它不会删除其他种类的空白字符(如制表符等)。 | |
trimBoth | 从字符串两端删除所有连续出现的空格。它不会删除其他种类的空白字符(如制表符等)。 |
函数 | 描述 | 示例 |
convertCharset(s, from, to) | 将字符串s从from编码转换为to编码。 | 示例:select convertCharset('我爱北京', 'utf8', 'gbk') as gbk_str, convertCharset(gbk_str, 'gbk', 'utf8') as utf8_str; 返回: ┌─gbk_str───┬─utf8_str─┐ │ ϒ°®±±¾© │ 我爱北京 │ └─────────┴──────┘ |
base64Encode(s) | 将's'字符串编码为base64。 | 示例:select base64Encode('a'); 返回:YQ== |
base64Decode(s) | 将base64编码的字符串's'解码为原始字符串。如果解码失败,将引发异常。 | 示例:select base64Decode('YQ=='); 返回:a |
tryBase64Decode(s) | 解码base64编码的字符串, 如果发生错误,则返回一个空字符串。 |
函数 | 描述 | 示例 |
CRC32(s) | 使用CRC-32-IEEE 802.3多项式和初始值0xffffffff(zlib实现)计算字符串的CRC32校验和。 返回类型为UInt32。 |
|
CRC32IEEE(s) | 使用CRC-32-IEEE 802.3多项式计算字符串的CRC32校验和。 返回类型为UInt32。 |
|
CRC64(s) | 使用CRC-64-ECMA多项式计算字符串的CRC32校验和。 返回类型为UInt64。 |
示例:select CRC64('ab'); 返回:18335630415216175809 |
函数 | 对应操作符 | 描述 |
plus(a, b) | a + b | 对两个数字求和。也可以对date/dateTime类型值与整型值(表示秒数)求和。 |
minus(a, b), | a - b | 支持date/dateTime类型值与整型值(表示秒数)相减。 |
multiply(a, b) | a * b | 数字乘积。 |
divide(a, b) | a / b | 计算数字的商,结果为浮点类型。当除以0时,结果为inf、-inf和nan。 |
intDiv(a, b) | 计算数字的商,结果为四舍五入后的整型。当除以0或最小负数除以负1时,将引发异常。 | |
intDivOrZero(a, b) | intDiv的扩展。当除以0或最小负数除以负1时,返回0。 | |
modulo(a, b) | a % b | 计算余数。如果参数是浮点数,则会删除小数部分将其转换为整数。 |
negate(a) | -a | 数值取发。 |
abs(a) | 取绝对值。 | |
gcd(a, b) | 最大公约数 | |
lcm(a, b) | 最小公倍数 |
1. 比较函数返回的结果为0或1, 数据类型UInt8。
2. 可以参与比较的数据类型为:
只能在每组之内进行比较,不能在不同组之间进行比较。例如,不能将date类型和string类型进行比较。
函数 | 操作符 |
equals | a = b 和 a == b |
notEquals | a ! = b 和 a <> b |
less | < |
greater | > |
lessOrEquals | <= |
greaterOrEquals | >= |
逻辑函数接受任何数值类型的参数, 返回0或1的UInt8数字。
参数0视为false, 其他任何非0参数视为true。
4. 时间相关转换
大类 | 细类 | 描述 |
toInt(8|16|32|64) | toInt8(expr) | 转换为有符号的整数,转换向零舍入(截断数字的小数位)。nan和inf未定义。 |
toInt16(expr) | ||
toInt32(expr) | ||
toInt64(expr) | ||
toUInt(8|16|32|64) | toUInt8(expr) | 转换为无符号的整数,转换向零舍入(截断数字的小数位)。nan和inf未定义。 如果传入参数为负数,转换将异常。 |
toUInt16(expr) | ||
toUInt32(expr) | ||
toUInt64(expr) | ||
toFloat(32|64) |
toFloat32(expr) | 转换为浮点数。 |
toFloat64(expr) | ||
toDecimal(32|64|128) | toDecimal32(value, S) | 将值转换为精度为S的Decimal数据类型。该值可以是数字或字符串。 S(比例)参数指定小数位数。 |
toDecimal64(value, S) | ||
toDecimal128(value, S) | ||
toDate | toDate(expr) | 标准的时间格式字符串。 |
toDateTime | toDateTime(expr) | 标准的时间格式字符串或Unix时间戳。 |
与常规的数据类型转换相比, -OrZero可以处理异常情况, 当转换失败时,则返回0。
注意:这里只能接收字符串的参数。
大类 | 细类 | 描述 |
toInt(8|16|32|64)OrZero | toInt8OrZero(expr) | |
toInt16OrZero(expr) | ||
toInt32OrZero(expr) | ||
toInt64OrZero(expr) | ||
toUInt(8|16|32|64)OrZero | toUInt8OrZero(expr) | |
toUInt16OrZero(expr) | ||
toUInt32OrZero(expr) | ||
toUInt64OrZero(expr) | ||
toFloat(32|64)OrZero |
toFloat32OrZero(expr) | |
toFloat64OrZero(expr) | ||
toDecimal(32|64|128)OrZero | toDecimal32OrZero(value, S) | 如下两种情况会导致转换异常: 1. 当不能将字符串转换为数字。 2. 能将字符串转换为数字, 但是精度超过S。 |
toDecimal64OrZero(value, S) | ||
toDecimal128OrZero(value, S) | ||
toDateOrZero | toDateOrZero(expr) | 日期转换异常不会返回0, 而是返回混乱的日期。 |
toDateTimeOrZero | toDateTimeOrZero(expr) |
与常规的数据类型转换相比, -OrNull可以处理异常情况, 当转换失败时,则返回Nulll。
注意:这里只能接收字符串的参数。
大类 | 细类 | 描述 |
toInt(8|16|32|64)OrNull | toInt8OrNull(expr) | |
toInt16OrNull(expr) | ||
toInt32OrNull(expr) | ||
toInt64OrNull(expr) | ||
toUInt(8|16|32|64)OrNull | toUInt8OrNull(expr) | |
toUInt16OrNull(expr) | ||
toUInt32OrNull(expr) | ||
toUInt64OrNull(expr) | ||
toFloat(32|64)OrNull |
toFloat32OrNull(expr) | |
toFloat64OrNull(expr) | ||
toDecimal(32|64|128)OrNull | toDecimal32OrNull(value, S) | 如下两种情况会导致转换异常: 1. 当不能将字符串转换为数字。 2. 能将字符串转换为数字, 但是精度超过S。 |
toDecimal64OrNull(value, S) | ||
toDecimal128OrNull(value, S) | ||
toDateOrNull | toDateOrNull(expr) | 日期转换异常不会返回0, 而是返回混乱的日期。 |
toDateTimeOrNull | toDateTimeOrNull(expr) |
函数 | 描述 |
toString |
将数字、字符串(非固定长度字符串)、date和datetime数据类型转换为字符串。 当将日期转换为字符串时,可额外增加第二个参数,用于指定时区。 |
toFixedString(s, N) | 将String类型的参数转换为FixedString(N)类型(固定长度为N的字符串),N必须为常数。如果字符串的字节数少于N,则在字符串右侧填充空字符串。如果字符串字节数大于N,则会转换异常。 |
toStringCutToZero(s) | 接受String或Fixed参数,在字符串参数的第一个0字节处被截断,返回截断后的字符串。 |
将"x"转换为"t"数据类型。 也可以写成: CAST(x as t) 。
可以将类型转换为Nullable 。
4.1 toInterval(Year|Quarter|Month|Week|Day|Hour|Minute|Second)
将数字类型转换为Interval数据类型。
1
toIntervalSecond(number)
2
toIntervalMinute(number)
3
toIntervalHour(number)
4
toIntervalDay(number)
5
toIntervalWeek(number)
6
toIntervalMonth(number)
7
toIntervalQuarter(number)
8
toIntervalYear(number)
4.2 日期解析
将数字类型参数解析为Date或DateTime类型。 与toDate和toDateTime不同,parseDateTimeBestEffort可以处理更复杂的日期格式。
函数 | 描述 |
parseDateTimeBestEffort | |
parseDateTimeBestEffortOrNull | 对于无法处理的格式,则返回Null。 |
parseDateTimeBestEffortOrZero | 对于无法处理的格式,则返回0。 |
select '20180831145618' as time, parseDateTimeBestEffort(time);
返回一个时间单位的开始时间。
toStartOfInterval(time_or_data, INTERVAL x unit [, time_zone])
toStartOfInterval(t, INTERVAL 1 year) 与toStartOfYear(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 1 month) 与toStartOfMonth(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 1 day) 与toStartOfDay(t)返回相同的结果。
toStartOfInterval(t, INTERVAL 15 minute) 与toStartOfFifteenMinutes(t) 返回相同的结果。
示例:toStartOfInterval(toDateTime('2020-04-22 15:21:35'), INTERVAL 15 minute)
add*函数用于给日期或时间添加一个时间间隔,subtract*函数用于给日期或时间减去一个时间间隔。
add*函数包含:ddYears, addMonths, addWeeks, addDays, addHours, addMinutes, addSeconds, addQuarters 。
subtract*函数包含:subtractYears, subtractMonths, subtractWeeks, subtractDays, subtractHours, subtractMinutes, subtractSeconds, subtractQuarters 。
用于计算两个Date或DateTime值之间的差。
语法:
1
dateDiff('unit', startdate, enddate, [timezone])
参数:
使用Format格式化时间,返回字符串类型。
1
formatDateTime(Time, Format[, Timezone])
格式的含义如下:
Modifier | Description | Example |
%C | year divided by 100 and truncated to integer (00-99) | 20 |
%d | day of the month, zero-padded (01-31) | 2 |
%D | Short MM/DD/YY date, equivalent to %m/%d/%y | 2001/2/18 |
%e | day of the month, space-padded ( 1-31) | 2 |
%F | short YYYY-MM-DD date, equivalent to %Y-%m-%d | 2018/1/2 |
%H | hour in 24h format (00-23) | 22 |
%I | hour in 12h format (01-12) | 10 |
%j | day of the year (001-366) | 2 |
%m | month as a decimal number (01-12) | 1 |
%M | minute (00-59) | 33 |
%n | new-line character ('\n') | |
%p | AM or PM designation | PM |
%R | 24-hour HH:MM time, equivalent to %H:%M | 22:33 |
%S | second (00-59) | 44 |
%t | horizontal-tab character ('\t') | |
%T | ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S | 22:33:44 |
%u | ISO 8601 weekday as number with Monday as 1 (1-7) | 2 |
%V | ISO 8601 week number (01-53) | 1 |
%w | weekday as a decimal number with Sunday as 0 (0-6) | 2 |
%y | Year, last two digits (00-99) | 18 |
%Y | Year | 2018 |
%% | a % sign | % |
函数 | 描述 | 使用示例 |
toTimeZone | 将时间/日期转换到指定的时区。 | 示例:toTimeZone(toDateTime('2020-03-22 10:00:00'), 'US/Samoa') 返回:2020-03-21 15:00:00 |
toYear | 将日期/时间转换为包含年份数字(AD)的UInt16数字。 | 示例:toYear(toDateTime('2020-03-22 10:00:00')) 示例:返回:2020 |
toQuarter | 计算时间所在的季度。季度从1开始计数。 | 示例:toQuarter(toDateTime('2020-04-22 10:00:00')) 返回:2 |
toMonth | 将时间转换为月份数(1-12)。 | 示例:toMonth(toDateTime('2020-04-22 10:00:00')) 返回:4 |
toDayOfYear | 转换为所在年度的天数字(1-366) | 示例:toDayOfYear(toDateTime('2020-04-22 10:00:00')) 返回:113 |
toDayOfMonth | 转换为所在月的天数字(1-31) | 示例:toDayOfMonth(toDateTime('2020-04-22 10:00:00')) 返回:22 |
toDayOfWeek | 转换为所在周的天数字(1-7),1时周一,7是周日。 | 示例:toDayOfWeek(toDateTime('2020-04-22 10:00:00')) 返回:3 |
toHour | 转换为小时的时间数字(0-23),类型为UInt8。 | 示例:toHour(toDateTime('2020-04-22 16:25:30')) 返回:16 |
toMinute | 转换为分钟时间数字(0-59),类型为UInt8。 | 示例:toMinute(toDateTime('2020-04-22 16:25:30')) 返回:25 |
toSecond | 转换为秒数的时间数字(0-59),类型为UInt8。 | 示例:toSecond(toDateTime('2020-04-22 16:25:30')) 返回:30 |
toUnixTimestamp | 转换Unix时间戳,类型为UInt32。 | 示例1:toUnixTimestamp(toDateTime('2020-04-22 16:25:30')) 返回:1587543930 示例2:toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo') 返回:1509836867 |
toStartOfYear | 将日期或时间舍入到一年中的第一天,返回类型为Date。 | 示例:toStartOfYear(toDateTime('2020-01-01 00:00:00')) 返回:2020-01-01 |
toStartOfISOYear | 将日期或时间舍入到ISO年中的第一天,返回类型为Date。 | 示例:toStartOfISOYear(toDateTime('2020-01-01 00:00:00')) 返回:2019-12-30 |
toStartOfQuarter | 将日期或时间舍入到季度的第一天,四个季度的第一天分别为:1月1日、4月1日、7月1日和10月1日。返回类型为Date。 | 示例:toStartOfQuarter(toDateTime('2020-03-21 00:00:00')) 返回:2020-01-01 |
toStartOfMonth | 将日期或时间舍入到月度的第一天。返回类型为Date。 | 示例:toStartOfMonth(toDateTime('2020-04-22 00:00:00')) 返回:2020-04-01 |
toMonday | 将日期或时间舍入到最近的周一。返回类型为Date。 | 示例:toMonday(toDateTime('2020-04-26 00:00:00')) 返回:2020-04-20 |
toStartOfWeek(t[,mode]) | 根据mode参数,将日期舍入到最近的周一或周日。返回类型为Date。 | 示例:toStartOfWeek(toDateTime('2020-04-22 00:00:00'), 3) 返回:2020-04-20 |
toStartOfDay | 将日期舍入到一天的开始时间, 返回类型为DateTime。 | 示例:toStartOfDay(toDateTime('2020-04-22 15:20:00')) 返回:2020-04-22 00:00:00 |
toStartOfHour | 将日期舍入到小时的开始时间, 返回类型为DateTime。 | 示例:toStartOfHour(toDateTime('2020-04-22 15:20:00')) 返回:2020-04-22 15:00:00 |
toStartOfMinute | 将日期舍入到分钟的开始时间, 返回类型为DateTime。 | 示例:toStartOfMinute(toDateTime('2020-04-22 15:21:35')) 返回:2020-04-22 15:21:00 |
toStartOfFiveMinute | 将日期舍入到5分钟间隔的开始时间, 返回类型为DateTime。 | 示例:toStartOfFiveMinute(toDateTime('2020-04-22 15:21:35')) 返回:2020-04-22 15:20:00 |
toStartOfTenMinutes | 将日期舍入到10分钟间隔的开始时间, 返回类型为DateTime。 | 示例:toStartOfTenMinutes(toDateTime('2020-04-22 15:21:35')) 返回:2020-04-22 15:20:00 |
toStartOfFifteenMinutes | 将日期舍入到15分钟间隔的开始时间, 返回类型为DateTime。 | 示例:toStartOfFifteenMinutes(toDateTime('2020-04-22 15:21:35')) 返回:2020-04-22 15:15:00 |
toStartOfInterval(time_or_data, INTERVAL x unit [, time_zone]) | toStartOf*函数的泛化形式,更灵活。 toStartOfInterval(t, INTERVAL 1 year) 与toStartOfYear(t)返回相同的结果。 toStartOfInterval(t, INTERVAL 1 month) 与toStartOfMonth(t)返回相同的结果。 toStartOfInterval(t, INTERVAL 1 day) 与toStartOfDay(t)返回相同的结果。 toStartOfInterval(t, INTERVAL 15 minute) 与toStartOfFifteenMinutes(t) 返回相同的结果。 |
示例:toStartOfInterval(toDateTime('2020-04-22 15:21:35'), INTERVAL 15 minute) 返回:2020-04-22 15:15:00 |
toRelativeYearNum | 从过去某个时间点起的年数。从公元0年开始起。 | 示例:toRelativeYearNum(toDateTime('2020-04-22 15:21:35')) 返回:2020 |
toRelativeQuarterNum | 从过去某个时间点起的季度数。从公元0年开始起。 | 示例:toRelativeQuarterNum(toDateTime('2020-04-22 15:21:35')) 返回:8081 |
toRelativeMonthNum | 从过去某个时间点起的月数。从公元0年开始起。 | 示例:toRelativeMonthNum(toDateTime('2020-04-22 15:21:35')) 返回:24244 |
toRelativeWeekNum | 从过去某个时间点起的周数。从1970年01月01日00时00分00秒起。 | 示例:toRelativeWeekNum(toDateTime('2020-04-22 15:21:35')) 返回:2625 |
toRelativeDayNum | 从过去某个时间点起的天数。从1970年01月01日00时00分00秒起。 | 示例:toRelativeDayNum(toDateTime('2020-04-22 15:21:35')) 返回:18374 |
toRelativeHourNum | 从过去某个时间点起的小时数。从1970年01月01日00时00分00秒起。 | 示例:toRelativeHourNum(toDateTime('2020-04-22 15:21:35')) 返回:440983 |
toRelativeMinuteNum | 从过去某个时间点起的分钟数。从1970年01月01日00时00分00秒起。 | 示例:toRelativeMinuteNum(toDateTime('2020-04-22 15:21:35')) 返回:26459001 |
toRelativeSecondNum | 从过去某个时间点起的秒数。从1970年01月01日00时00分00秒起。 | 示例:toRelativeSecondNum(toDateTime('2020-04-22 15:21:35')) 返回:1587540095 |
toISOYear | 将日期或时间转换为ISO年份号的UInt16类型数字。 | 示例:toISOYear(toDateTime('2020-04-22 15:21:35')) 返回:2020 |
toISOWeek | 将日期或时间转换为ISO周数的UInt8类型数字。 | 示例:toISOWeek(toDateTime('2020-01-01 15:21:35')) 返回:1 |
toWeek(date[,mode]) | 返回日期或时间的周数。第二个参数mode指定一周从周一或周日开始,以及返回值在0-53或1-53之间。mode默认值为0。当mode为3, 相当于toISOWeek。 具体参见mode部分的解析。 |
示例:toWeek(toDateTime('2020-01-01 15:21:35')) 返回:0 |
toYearWeek(date[,mode]) | 返回date的年和周。mode指定了周的计算方式。具体参见mode部分的解析。 toISOYear()等价于intDiv(toYearWeek(date,3),100)。 |
示例:toYearWeek(toDate('2016-01-02'), 0) as mode0, toYearWeek(toDate('2016-01-02'), 2) as mode2 返回: ┌──mode0─┬──mode2─┐ │ 201552 │ 201552 │ └───────┴───────┘ |
now | 返回请求执行的当前时刻的时间 | 示例:now() 返回:2020-04-22 12:40:56 |
today | 返回请求执行的当前时刻的日期 | 示例:today() 返回:2020-04-22 |
yesterday | 返回请求执行的当前时刻的前一天日期。等价于: today() - 1 。 | 示例:yesterday() 返回:2020-04-21 |
timeSlot | 将时间舍入为半小时。 | 示例:timeSlot(toDateTime('2020-04-22 12:29:20')) as half1, timeSlot(toDateTime('2020-04-22 12:31:20')) half2; 返回: ┌───────half1────┬──────half2─────┐ │ 2020-04-22 12:00:00 │ 2020-04-22 12:30:00 │ └──────────────┴──────────────┘ |
toYYYYMM | 将日期或时间转换为包含年份和月份的数字(YYYY * 100 + MM),类型为UInt32。 | 示例:toYYYYMM(toDateTime('2020-04-22 12:31:20')) 返回:202004 |
toYYYYMMDD | 将日期或时间转换为包含年份和月份的数字(YYYY * 10000 + MM*100 + DD),类型为UInt32。 | 示例:toYYYYMMDD(toDateTime('2020-04-22 12:31:20')) 返回:20200422 |
toYYYYMMDDhhmmss | 将日期或时间转换为包含年份和月份的数字(YYYY * 10000000000 + MM * 100000000 + DD * 1000000 + hh * 10000 + mm * 100 + ss),类型为UInt64。 | 示例:toYYYYMMDDhhmmss(toDateTime('2020-04-22 12:31:20')) 返回:20200422123120 |
关于日期转换函数的mode参数:
Mode | 一周的第一天 | 范围 | 第一周计算方法 |
0 | Sunday | 0-53 | 如果包含1月1日的一周在新年中有一个周日,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
1 | Monday | 0-53 | 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
2 | Sunday | 1-53 | 如果包含1月1日的一周在新年中有一个周日,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
3 | Monday | 1-53 | 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
4 | Sunday | 0-53 | 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
5 | Monday | 0-53 | 如果包含1月1日的一周在新年中有一个周一,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
6 | Sunday | 1-53 | 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
7 | Monday | 1-53 | 如果包含1月1日的一周在新年中有一个周一,则为第1周。否则为上一年的最后一周,而下周为第1周。 |
8 | Sunday | 1-53 | 包含1月1日的那周为第一周。 |
9 | Monday | 1-53 | 包含1月1日的那周为第一周。 |
关于mode0和mode2的区别:
mode0和mode2的每周都是以周日开始,它们第一周的计算方式也完全一样,但是日期的范围不一样,即第一周之前的周数一个显示为0, 一个显示为上一年度的周数。
日期 | 周数 |
toWeek(toDate('2016-01-03'), 0) | 1 |
toWeek(toDate('2016-01-03'), 2) | 1 |
toWeek(toDate('2016-01-02'), 0) | 0 |
toWeek(toDate('2016-01-02'), 2) | 52 |
但是与toYearWeek有差异:
日期 | 周数 |
toYearWeek(toDate('2016-01-03'), 0) | 201601 |
toYearWeek(toDate('2016-01-03'), 2) | 201601 |
toYearWeek(toDate('2016-01-02'), 0) | 201552 |
toYearWeek(toDate('2016-01-02'), 2) | 201552 |
从字符串中查找子字符串的位置,默认以字节为单位和大小写敏感,
使用衍生的*CaseInsensitive和*UTF8函数进行不区分大小写和UTF8编码的字符串搜索。
在搜索时同时使用忽略大小写和使用UTF8编码的规则,则使用衍生的*CaseInsensitiveUTF8函数。
位置索引从1开始。
函数 | 描述 | 示例 |
position(haystack, needle) locate(haystack, needle) |
以字节为单位,在字符串haystack中搜索子字符串needle。 | 示例:SELECT position('Hello, world!', '!'); 返回:13 |
positionCaseInsensitive | 字符串搜索不区分大小写。 | 示例:SELECT positionCaseInsensitive('Hello, world!', 'L'); 返回:3 |
positionUTF8 | 以UTF8编码单位,搜索字符串。 | 示例:SELECT positionUTF8('中国北京', '北'); 返回:3 |
positionCaseInsensitiveUTF8 | 以UTF8编码单位,不缺分大小写,搜索字符串。 |
函数 | 描述 | 示例 |
multiSearchAllPositions | 语法: multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen])。 搜索子字符串数组中的元素在字符串中出现的位置,返回子字符串对应的位置数组。 |
示例:SELECT multiSearchAllPositions('Hello, World!', ['Hello', '!', 'world']); 返回:[1,13,0] |
multiSearchAllPositionsUTF8 | 与函数multiSearchAllPositions功能相同,只是使用UTF8编码单位进行搜索。 | |
multiSearchFirstPosition(haystack, [needle1, needle2, …, needlen]) | 返回匹配的最左边的偏移量。 返回类型为UInt64。 大小写和UTF8编码的相关的衍生函数: multiSearchFirstPositionCaseInsensitive, multiSearchFirstPositionUTF8, multiSearchFirstPositionCaseInsensitiveUTF8。 |
示例:SELECT multiSearchFirstPosition('Hello, World!', ['Hello', '!', 'world']); 返回:1 |
multiSearchFirstIndex(haystack, [needle1, needle2, …, needlen]) | 搜索子字符串数组中的元素在字符串中出现的位置,返回第一个匹配的数组索引。 大小写和UTF8编码的相关的衍生函数: multiSearchFirstIndexCaseInsensitive, multiSearchFirstIndexUTF8, multiSearchFirstIndexCaseInsensitiveUTF8。 |
示例:SELECT multiSearchFirstIndex('Hello, World!', ['AB', '!', 'He']); 返回:2 数组中的第二个元素"!"第一次匹配字符串。 |
multiSearchAny(haystack, [needle1, needle2, …, needlen]) | 搜索子字符串数组中的元素在字符串中出现的位置。如果至少有一个子字符串匹配,则返回1,否则返回0。大小写和UTF8编码的相关的衍生函数:multiSearchAnyCaseInsensitive, multiSearchAnyUTF8, multiSearchAnyCaseInsensitiveUTF8。 | 示例:SELECT multiSearchAny('Hello, World!', ['AB', '!', 'He']); 返回:1 |
检查字符串是否与正则表达式匹配。
正则表达式使用re2的语法。
反斜杠符号(\)用于在正则表达式中转义,为了转义表达式中的符号,必须在字符串文本中使用双斜杠。
在字符串中搜索子字符串,最好使用LIKE或position,它们能提供更快的性能。
re2正则表达式语法:https://github.com/google/re2/wiki/Syntax 。
函数 | 描述 | 示例 |
match(haystack, pattern) | 检查字符串是否与正则表达式匹配。如果匹配则返回1,否则返回0。 | 示例:select match('Hello','ll'); 返回:1 |
multiMatchAny(haystack, [pattern1, pattern2, …, patternn]) | 使用一个pattern数组的元素分别匹配字符串,如果没有匹配的正则表达式,则返回0。如果任何一个pattern匹配,则返回1。 | 示例:select multiMatchAny('Hello World',['W','a','o']); 返回:1 |
multiMatchAnyIndex(haystack, [pattern1, pattern2, …, patternn]) | 使用一个pattern数组的元素分别匹配字符串,如果没有匹配的正则表达式,则返回0。如果任何一个pattern匹配,则匹配的pattern数组的索引。 | 示例:select multiMatchAnyIndex('Hello World',['W','e']); 返回:2 |
multiMatchAllIndices(haystack, [pattern1, pattern2, …, patternn]) | 使用一个pattern数组的元素分别匹配字符串,返回所有匹配的pattern的元素的数组下标。 | 示例:select multiMatchAllIndices('Hello World',['W','a','o']); 返回:[3,1] |
extract(haystack, pattern) | 使用正则表达式提取字符串的片段。如果不匹配,则返回空字符串。如果regex不含子模式,则它将获取与整个regex匹配的片段,否则,它将获取第一个子模式匹配的片段。 | 示例1:select extract('China,Chinese','Chin[a|e]') ; 返回:China 示例2:select extract('China Node,Chinese Note','(Chin[a|e]) (No[t|d]e)') ; 返回:China |
extractAll(haystack, pattern) | 使用正则表达式提取所有字符串的片段。如果不匹配,则返回空字符串。如果regex不含子模式,则它将获取与整个regex匹配的片段,否则,它将获取第一个子模式匹配的片段。 | 示例1:select extractAll('China,Chinese','Chin[a|e]') 返回:['China','Chine'] 示例2:select extractAll('China-Node,Chinese-Note','(Chin[a|e])-') ; 返回:['China'] |
检查字符串是否与pattern匹配,patter可包含两个符号:_和%。
_表示任意一个字节的占位。
%表示任何字节的任何数量(包括零个字符)
函数 | 描述 | 示例 |
like(haystack, pattern) | 相同语义的操作符:" haystack LIKE pattern"。 | 示例:select like('I Love China','%Love%') ; 返回:1 |
notLike(haystack, pattern) | like的取反。 |
使用子字符串"pattern"匹配字符串"haystack", 将字符串中的第一个匹配项(如果存在)替换为"replacement"子字符串。
"pattern"和"replacement"必须是常量。
将"haystack"中所有出现的"pattern"的子字符串替换为"replacement"子字符串。
使用"pattern"正则表达式进行替换,正则表达式使用re2语法。
仅替换第一个匹配项(如何存在)。
pattern可以指定为"replacement", 这个pattern可以包括替换项: \0-\9。 替换项\0包括整个正则表达式,替换项\1-\9对应于子pattern。如果要在模板中使用\字符,使用\对其进行转义(即使用双斜杠)。
替换所有出现的子字符串。
在预定义的字符之前添加反斜杠。
预定义字符: ‘0’, ‘\’, ‘|’, ‘(’, ‘)’, ‘^’, ‘$’, ‘.’, ‘[’, ’]’, ‘?’, ’*‘, ’+‘, ’{‘, ’:‘, ’-’。
全部评论