clickhouse的where中使用不确定性函数

需求

要实现一个脚本,删除clickhouse七天前的数据

SQL

找到了date_trunc函数,参考了 https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions/

官方用法,比如SELECT now(), date_trunc('hour', now());

1
date_trunc(unit, value[, timezone])

Alias: dateTrunc.

Arguments

  • unit — The type of interval to truncate the result. String Literal. Possible values:
    • second
    • minute
    • hour
    • day
    • week
    • month
    • quarter
    • year
  • value — Date and time. DateTime or DateTime64.
  • timezoneTimezone name for the returned value (optional). If not specified, the function uses the timezone of the value parameter. String.

执行:

ALTER table t ON CLUSTER c DELETE WHERE create_time < date_add(DAY, -7, date_trunc('day', now())))

报错了:ALTER UPDATE/ALTER DELETE statements must use only deterministic functions.

报错原因:因为clickhouse在where中使用不确定性函数,now() 函数在 ClickHouse 中也是不确定性函数。”date_add” 和 “date_trunc” 不是确定性函数。where后面不可以放上不确定性函数。

通过shell脚本实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 该脚本的功能为:删除clickhouse里的七天前的数据

BEGIN=$(date +%s --date='-7 day')
HOST=x
DATABASE=x
USERNAME=x
PASSWORD=x
TABLE=x
CLUSTER=x

clickhouse-client \
--host="$HOST" \
--user="$USERNAME" \
--database="$DATABASE" \
--password="$PASSWORD" \
--query="ALTER table $TABLE ON CLUSTER $CLUSTER DELETE WHERE create_time < FROM_UNIXTIME($BEGIN);"

clickhouse的where中使用不确定性函数
https://nrbackback.github.io/2023/02/21/clickhouse的where中使用不确定性函数/
作者
John Doe
发布于
2023年2月21日
许可协议