Clickhouse时间日期函数一文详解+代码展示

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Clickhouse时间日期函数一文详解+代码展示

前言


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.取当前时间


now()


1. SELECT
2. now() AS time


a3dea51022f2474da051f2e16494dfa8.png

today()


1. SELECT
2. today() AS time


7d21a1a5b4574a5688ad895502335be0.png


获取当前时间戳


1. SELECT
2. toUnixTimestamp(now()) AS time


2d29d795865e4450ad754d9efd9c323a.png


2.取年月日季度


toYear()


1. SELECT
2. toYeara(now()) AS time

8beb95845dbd4af98b957d2df6421c29.png


toMonth()


1. SELECT
2. toMonth(now()) AS time



e11fbcfd870546e5b277331defd060a3.png


toDayOfMonth()


1. SELECT
2.     toDayOfMonth(now()) AS time


eb0b9f35bd77483d8e7d9d36e9e75cb7.png


获取季度toQuarter()


1. SELECT
2. toQuarter(now()) AS time


out:3


3.日期转化


日期化为天数


1. SELECT
2.     toDayOfYear(now()) AS time


e7130d3b8a2747e891643190e40ab621.png

当天日期所在当月周数


1. SELECT
2. toDayOfWeek(now()) AS time

eef7c26edab543e5891031c29b990fee.png

4.获取起始时间


获取当前时间的起始时间toStartOfDay(now()):


1. SELECT
2.     toStartOfDay(now()) AS time


aff046161a5443068ebd69001c4e12b8.png


格式就是这样的格式,大家跟着前面那种表来对就没问题。


二、时间格式转换函数


1.formatDateTime(<时间数据>,'format格式')


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 位


用法代码:


1. SELECT
2.     formatDateTime(now(),'%Y-%m-%d')AS time


2013828a32784ea799222dd2c0e0ffcc.png


可以根据format格式自由组合。


2.toYYYYMM()类型


该类型有三个:


格式 结果
toYYYYMM() 202207
toYYYYMMDD() 20220713
toYYYYMMDDhhmmss() 20220713154017


化为时间戳形式toUnixTimestamp():


1. SELECT
2. toUnixTimestamp(now()) AS time



1a0b1b3472574aa0bbd49408235f8c00.png


三、时间数据类型转换


toDateTime()


1. SELECT
2.     toDateTime('2022-07-13 14:28:33') AS time


将可识别为日期时间的字符串转化为具体时间。


toDate()


1. 
SELECT
2.     toDate('2022-07-13 14:28:33') AS time


将可识别为日期的字符串转化为具体日期


四、时间运算函数


1.interval


interval关键字是和MySQL是一样的,大家不清楚的可以去看:

一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解

很简单就可以进行时间加减:

SELECT
    toDate('2022-07-13 14:28:33')-interval 3 day AS time

ec55bb1277a946ce9df2eea910e2f167.png


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


8fea6144cf564bffb6d0c56dd7882264.png


3.subtract减去时间


和add是一样的,故不作表格展示,展示代码用法:


1. SELECT
2.     subtractYears(toDate('2022-07-13 14:28:33'),1) AS time


75e146c37bff45f49069219ca01ec377.png

4.时间差值 dateDiff()


也是很简单的一个函数看过一次会有就好了:

SELECT
   dateDiff('year',toDate('2022-07-13 14:28:33'),toDate('2023-07-13 14:28:33')) AS time

3fc84168b30240039c15f20b6db2a164.png


后面一个时间减去前面一个时间,前面的参数为时间类似:

有: 'year','month','week','day','hour','minute','second'。

目录
相关文章
|
4月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
531 0
|
7月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之同步MySQL时,发现Timestamp字段少八个小时,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
存储 数据可视化 关系型数据库
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
本文探讨MySQL中时间类型的选择,阐述datetime、timestamp、整形时间戳等类型特点以及它们在千万级数据量下的查询性能
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
|
7月前
|
SQL 资源调度 关系型数据库
实时计算 Flink版产品使用合集之在抓取 MySQL binlog 数据时,datetime 字段会被自动转换为时间戳形式如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
79 2
|
7月前
|
关系型数据库 MySQL
Mysql基础第十三天,创建计算字段
Mysql基础第十三天,创建计算字段
33 0
|
SQL 关系型数据库 MySQL
MySQL实战基础知识入门(8):当天和昨天24小时数据统计的sql语句解决方案
MySQL实战基础知识入门(8):当天和昨天24小时数据统计的sql语句解决方案
441 0
MySQL实战基础知识入门(8):当天和昨天24小时数据统计的sql语句解决方案
|
前端开发 关系型数据库 MySQL
Echarts高级进阶教程(5):mysql大数据量分表分区的API接口读取语句
Echarts高级进阶教程(5):mysql大数据量分表分区的API接口读取语句
135 0
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据
如何识别重叠的日期范围、日期出现次数、确定当前记录和下一条记录之间相差的天数【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据
|
SQL BI Serverless
【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据
本篇文章讲解的主要内容是:***汇总报表时常要求按季度分类汇总这就需要通过给定年份获取对应的季度开始结束时间、业务数据不连续的情况下如何统计所有年份数据、如何统计相同月份与周内日期聘用的员工、如何返回2月或12月聘用的所有员工以及周二聘用的所有员工***
【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算
日、月、年、时、分、秒之差及时间间隔计算。【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。本章介绍的关于时间的计算比较简单,主要是为了后面时间计算文章做铺垫!
【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算