前言
Clickhouse是一个面向联机分析处理(OLAP)的开源的面向列式存储的DBMS,简称CK, 与Hadoop, Spark相比,ClickHouse很轻量级,由俄罗斯第一大搜索引擎Yandex于2016年6月发布, 开发语言为C++。主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。
时间在数据库中经常作为时间索引,在数据入库和出库以及更新的时候都需要变化。在一些指标计算或者是提取某段时间的数据时,都会根据数据库中的时间索引数据进行操作。因此很大一部分我们操作数据都得先从时间数据下手,但是想要真正提取到我们想要的时间作为索引,还需要我们掌握许多功能函数方便我们操作,这是一个比较复杂的运用过程。因此特地写下这篇文章,记录一些十分好用常用的处理Clickhouse数据库SQL时间数据的函数,以及实例运用这些函数完成一些复杂查询任务。希望能够帮助到正在看此博文的各位,如果还有什么问题解决不了尽请在评论区提出,博主会一一作答。
一、时间函数
和MySQL时间函数有些不同,但是时间函数的功能是一样的,这里把常用的时间函数给出,效果以实际代码运行结果为准:
函数 效果 描述
now() 2022-07-13 14:28:33 取当前时间
toUnixTimestamp(now()) 1657695998 获取当前时间戳
toYear(now()) 2022 取日期中的年份
toMonth(now()) 7 取日期中的月份
today() 2022-07-13 今天的日期
toDate(now()) 2022-07-13 取日期中的日期
yesterday() 2022-07-12 昨天的日期
toQuarter(now()) 3 获取当前日期季度
toDayOfMonth(now()) 13 当前月份的天数
toDayOfYear(now()) 194 日期化为天数
toDayOfWeek(now()) 3 获取星期几
toMonday(now()) 2022-07-11 当前周的第一天
toHour(now()) 14 取日期时间中的小时
toMinute(now()) 42 取日期时间中的分钟
toSecond(now()) 40 取日期时间中的秒
toStartOfQuarter(now()) 2022-07-01 当前季度的第一天
toStartOfMinute(now()) 2022-07-13 14:57:00 当前起始分钟时间
toStartOfHour(now()) 2022-07-13 14:00:00 当前起始小时时间
toStartOfDay(now()) 2022-07-13 00:00:00 当天起始时间
toStartOfYear(now()) 2022-01-01 当前年份的第一天
toStartOfMonth(now()) 2022-07-01 当前月份的第一天
1.取当前时间
out:3
格式就是这样的格式,大家跟着前面那种表来对就没问题。
format格式:
格式 描述
%a 星期名缩写
%b 月名缩写
%c 代表几月的数值
%D 带时序后缀的数值-天
%d 天数,数值(00-31)
%e 天数,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 转换为天数 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%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) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 当前周的天数,(0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位
用法代码:
可以根据format格式自由组合。
该类型有三个:
格式
|
结果
|
toYYYYMM()
|
202207
|
toYYYYMMDD()
|
20220713
|
toYYYYMMDDhhmmss()
|
20220713154017
|
将可识别为日期时间的字符串转化为具体时间。
将可识别为日期的字符串转化为具体日期
interval关键字是和MySQL是一样的,大家不清楚的可以去看:
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
很简单就可以进行时间加减:
SELECT
toDate('2022-07-13 14:28:33')-interval 3 day AS time
2.add增加时间
和MySQL的date_add是一样的,给出列表均已测试:
代码 描述
addYears(<时间>,<数值>) 增加<数值>年份
addMonths(<时间>,<数值>) 增加<数值>月份
addWeeks(<时间>,<数值>) 增加<数值>周数
addDays(<时间>,<数值>) 增加<数值>天数
addHours(<时间>,<数值>) 增加<数值>小时
addMinutes(<时间>,<数值>) 增加<数值>分钟
addSeconds(<时间>,<数值>) 增加<数值>秒数
addQuarters(<时间>,<数值>) 增加<数值>季度
代码使用展示:
1. SELECT
2. addYears(toDate('2022-07-13 14:28:33'),1) AS time
3.subtract减去时间
和add是一样的,故不作表格展示,展示代码用法:
1. SELECT
2. subtractYears(toDate('2022-07-13 14:28:33'),1) AS time
4.时间差值 dateDiff()
也是很简单的一个函数看过一次会有就好了:
SELECT
dateDiff('year',toDate('2022-07-13 14:28:33'),toDate('2023-07-13 14:28:33')) AS time
后面一个时间减去前面一个时间,前面的参数为时间类似:
有: 'year','month','week','day','hour','minute','second'。