ClickHouse 日期时间的相关操作函数(十三)
ClickHouse 日期时间的相关操作函数(十三)
本文来源: ( https://www.cnblogs.com/traditional/tag/ClickHouse:一款速度快到让人发指的列式存储数据库/ )
楔子
下面来说一说日期和时间的相关操作。
toDate、toDateTime:将字符串转成 Date、DateTime
1 | SELECT toDate('2020-11-11 12:12:12') v1, toDateTime('2020-11-11 12:12:12') v2; |
对于 toDateTime 在转换的时候也可以指定时区:
1 | -- Asia/Shanghai 为东八区,将 UTC 的时间转成 Asia/Shanghai 之后,会增加 8 小时 |
timeZone:返回当前服务器所在的时区
1 | SELECT timeZone(); |
toTimeZone:转换 DataTime 所在的时区
1 | -- 转换 DateTime 所在的时区 |
timeZoneOf:返回 DateTime 所在的时区
1 | WITH toDateTime('2020-01-01 12:11:33', 'UTC') AS v1, toTimeZone(v1, 'Asia/Shanghai') AS v2 |
timeZoneOffset:返回某个时区和 UTC 之间的偏移量
比如 Asia/Shanghai 和 UTC 之间查了 8 个小时,也就是 8 * 3600 秒
1 | -- 我们需要使用 timeZoneOffset 的时候,需要先使用 toTypeName 获取相应的类型 |
toYear:获取 DateTime、Date 的年份
toMonth:获取 DateTime、Date 的月份
toQuarter:获取 DateTime、Date 的季度
1 | WITH toDate('2020-08-21') AS v |
toHour:获取 DateTime 的小时
toMinute:获取 DateTime 的分钟
toSecond:获取 DateTime 的秒
1 | WITH toDateTime('2020-08-21 12:11:33') AS v |
toDayOfYear:返回某个 DateTime、Date 是一年当中的第几天(1 ~ 366)
toDayOfMonth:返回某个 DateTime、Date 是一个月当中的第几天(1 ~ 31)
toDayOfWeek:返回某个 DateTime、Date 是一周当中的第几天(星期一是 1,星期天是 7)
1 | WITH toDateTime('2020-08-21 12:11:33') AS v |
toStartOfYear:返回一个 DateTime、Date 所在的年的第一天
toStartOfMonth:返回一个 DateTime、Date 所在的月的第一天
toStartOfQuarter:返回一个 DateTime、Date 所在的季度的第一天
1 | -- 2020-08-21 12:22:33 所在的年的第一天是 2020-01-01 |
toMonday:返回一个距离指定 DateTime、Date 最近的星期一
1 | -- 2020-08-21 是星期五,所以最近的星期一是 2020-08-17 |
dateTrunc:将 DateTime 按照指定部分进行截断,截断后的部分使用 0 填充
1 | -- 这里按小时截断,截断后的部分直接丢弃或者用 0 填充,所以会得到 2020-08-21 12:00:00 |
dateAdd、dateSub:给 DateTime、Date 加/减 一个时间间隔
1 | WITH toDateTime('2017-08-21 12:22:33') AS v |
dateSub 的用法与之一样,其实当 dateAdd 加的时间间隔为负数时,等同于 dateSub。时间间隔的单位可以是 year、quarter、month、week、day、hour、minute、second,并且除了使用函数之外,我们也可以直接相加。
1 | -- v + INTERVAL 3 YEAR 等价于 v - INTERVAL -3 YEAR |
dataDiff:计算两个 DateTime、Date 的差值
1 | WITH toDateTime('2017-08-21 12:22:33') AS v1, toDateTime('2018-09-15 11:44:55') AS v2 |
now:返回当前的 DateTime
1 | -- 默认是本地时区,当然我们也可以手动指定 |
today:返回当前的 Date,类似于 toDate( now() )
yesterday:前一天,类似于 today() - INTERVAL 1 DAY
1 | SELECT today(), yesterday(), today() - INTERVAL 1 DAY; |
toYYYYMM:将 DateTime、Date 使用整型表示,保留到月
1 | SELECT toYYYYMM(toDate('2020-11-11')); |
formatDateTime:讲一个 DateTime、Date 格式化成字符串
1 | SELECT formatDateTime(toDateTime('2020-01-01 11:11:11'), '%F'); |
函数不难,主要是一些格式符号我们需要记忆,以下是一些常见的格式符号:
%Y: 对应年
%m: 对应月,01 ~ 12
%d: 对应天,01 ~ 31
%H: 对应小时,00 ~ 23
%M: 对应分钟,00 ~ 59
%S: 对应秒钟,00 ~ 59
%F: 对应年月日,相当于 %Y-%m-%d
%j: 一年中的第几天,001 ~ 366
%P: 对应上午还是下午
%Q: 对应季度,1 ~ 4
%R: 相当于 %H:%M
%u: 星期几,1 ~ 7
%V: 一年中的第几个星期,01 ~ 53
dateName:返回 DateTime 指定部分,得到的是字符串
1 | WITH toDateTime('2020-09-17 11:22:33') AS v |
FROM_UNIXTIME:将一个时间戳转成时间
1 | -- 默认转换的格式是 年-月-日 时:分:秒,当然我们也可以指定格式 |
toUnixTimestamp:将一个 DateTime、Date 转成时间戳
1 | -- 里面除了字符串,也可以传递 DateTime、Date |