面向OLAP的列式存储DBMS-9-[ClickHouse]的常用日期时间操作

news2024/11/23 11:15:07

ClickHouse 日期时间的相关操作函数
在这里插入图片描述

1 日期时间操作函数

1.1 toDate和toDateTime

toDate、toDateTime:将字符串转成 Date、DateTime
一、传入字符串

SELECT toDate('2020-11-11 12:12:12') v1, toDateTime('2020-11-11 12:12:12') v2;
/*
┌─────────v1─┬──────────────────v2─┐
│ 2020-11-11 │ 2020-11-11 12:12:12 │
└────────────┴─────────────────────┘
*/

二、传入Date和DateTime

-- 当然除了字符串,也可以传入 DateTime、Date
WITH toDate('2020-11-11 12:12:12') AS v1, toDateTime('2020-11-11 12:12:12') AS v2
SELECT v1, v2, toDateTime(v1) v3, toDate(v2) v4;
/*
┌─────────v1─┬──────────────────v2─┬──────────────────v3─┬─────────v4─┐
│ 2020-11-11 │ 2020-11-11 12:12:12 │ 2020-11-11 00:00:00 │ 2020-11-11 │
└────────────┴─────────────────────┴─────────────────────┴────────────┘
*/

三、传入时间戳

-- 当然时间戳也是可以的
SELECT toDate(1605067932), toDateTime(1605067932);
/*
┌─toDate(1605067932)─┬─toDateTime(1605067932)─┐
│         2020-11-11 │    2020-11-11 12:12:12 │
└────────────────────┴────────────────────────┘
*/

四、对于toDateTime在转换的时候也可以指定时区:

-- Asia/Shanghai 为东八区,将 UTC 的时间转成 Asia/Shanghai 之后,会增加 8 小时
SELECT toDateTime('2020-11-11 12:12:12', 'UTC') v1, 
toDateTime(v1, 'Asia/Shanghai') v2;
/*
┌──────────────────v1─┬──────────────────v2─┐
│ 2020-11-11 12:12:12 │ 2020-11-11 20:12:12 │
└─────────────────────┴─────────────────────┘
*/

1.2 timeZone

timeZone:返回当前服务器所在的时区

SELECT timeZone();
/*
┌─timeZone()────┐
│ Asia/Shanghai │
└───────────────┘
*/

1.3 toTimeZone

toTimeZone:转换 DataTime 所在的时区

-- 转换 DateTime 所在的时区
SELECT toDateTime('2020-01-01 12:11:33', 'UTC') v1, 
toTimeZone(v1, 'Asia/Shanghai') v2;
/*
┌──────────────────v1─┬──────────────────v2─┐
│ 2020-01-01 12:11:33 │ 2020-01-01 20:11:33 │
└─────────────────────┴─────────────────────┘
*/

1.4 timeZoneOf

timeZoneOf:返回 DateTime 所在的时区

WITH toDateTime('2020-01-01 12:11:33', 'UTC') AS v1, 
toTimeZone(v1, 'Asia/Shanghai') AS v2
SELECT timeZoneOf(v1), timeZoneOf(v2);
/*
┌─timeZoneOf(v1)─┬─timeZoneOf(v2)─┐
│ UTC            │ Asia/Shanghai  │
└────────────────┴────────────────┘
*/

1.5 timeZoneOffset

timeZoneOffset:返回某个时区和 UTC 之间的偏移量。
比如 Asia/Shanghai 和 UTC 之间查了 8 个小时,也就是 8 * 3600 秒

-- 我们需要使用timeZoneOffset的时候,需要先使用toTypeName获取相应的类型
WITH toDateTime('2020-01-01 11:11:11', 'Asia/Shanghai') AS v
SELECT toTypeName(v) type, timeZoneOffset(v) offset_second, 
offset_second / 3600 offset_hour;
/*
┌─type──────────────────────┬─offset_second─┬─offset_hour─┐
│ DateTime('Asia/Shanghai')288008 │
└───────────────────────────┴───────────────┴─────────────┘
*/

-- 任何一个值的类型都可以通过 toTypeName 查看
SELECT toTypeName(123), toTypeName('你好'), 
toTypeName([]), toTypeName((1, 2));
/*
┌─toTypeName(123)─┬─toTypeName('你好')─┬─toTypeName(array())─┬─toTypeName((1, 2))──┐
│ UInt8           │ String             │ Array(Nothing)      │ Tuple(UInt8, UInt8) │
└─────────────────┴────────────────────┴─────────────────────┴─────────────────────┘
*/

1.6 toYear和toMonth和toQuarter

toYear:获取 DateTime、Date 的年份
toMonth:获取 DateTime、Date 的月份
toQuarter:获取 DateTime、Date 的季度

WITH toDate('2020-08-21') AS v
SELECT toYear(v), toMonth(v), toQuarter(v);
/*
┌─toYear(v)─┬─toMonth(v)─┬─toQuarter(v)─┐
│      202083 │
└───────────┴────────────┴──────────────┘
*/

1.7 toHour和toMinute和toSecond

toHour:获取 DateTime 的小时
toMinute:获取 DateTime 的分钟
toSecond:获取 DateTime 的秒

WITH toDateTime('2020-08-21 12:11:33') AS v
SELECT toHour(v), toMinute(v), toSecond(v);
/*
┌─toHour(v)─┬─toMinute(v)─┬─toSecond(v)─┐
│        121133 │
└───────────┴─────────────┴─────────────┘
*/

1.8 toDayOfYear和toDayOfMonth和toDayOfWeek

toDayOfYear:返回某个 DateTime、Date 是一年当中的第几天(1 ~ 366)
toDayOfMonth:返回某个 DateTime、Date 是一个月当中的第几天(1 ~ 31)
toDayOfWeek:返回某个 DateTime、Date 是一周当中的第几天(星期一是 1,星期天是 7)

WITH toDateTime('2020-08-21 12:11:33') AS v
SELECT toDayOfYear(v), toDayOfMonth(v), toDayOfWeek(v);
/*
┌─toDayOfYear(v)─┬─toDayOfMonth(v)─┬─toDayOfWeek(v)─┐
│            234215 │
└────────────────┴─────────────────┴────────────────┘
*/

1.9 toStartOfYear和toStartOfMonth和toStartOfQuarter

toStartOfYear:返回一个 DateTime、Date 所在的年的第一天
toStartOfMonth:返回一个 DateTime、Date 所在的月的第一天
toStartOfQuarter:返回一个 DateTime、Date 所在的季度的第一天

-- 2020-08-21 12:22:33 所在的年的第一天是 2020-01-01
-- 2020-08-21 12:22:33 所在的月的第一天是 2020-08-01
-- 2020-08-21 12:22:33 所在的季度的第一天是 2020-07-01,第三季度
WITH toDateTime('2020-08-21 12:22:33') AS v
SELECT toStartOfYear(v), toStartOfMonth(v), toStartOfQuarter(v);
/*
┌─toStartOfYear(v)─┬─toStartOfMonth(v)─┬─toStartOfQuarter(v)─┐
│       2020-01-01 │        2020-08-01 │          2020-07-01 │
└──────────────────┴───────────────────┴─────────────────────┘
*/

1.10 toMonday

toMonday:返回一个距离指定 DateTime、Date 最近的星期一

-- 2020-08-21 是星期五,所以最近的星期一是 2020-08-17
WITH toDateTime('2020-08-21 12:22:33') AS v
SELECT toDayOfWeek(v), toMonday(v);
/*
┌─toDayOfWeek(v)─┬─toMonday(v)─┐
│              52020-08-17 │
└────────────────┴─────────────┘
*/

1.11 dateTrunc

dateTrunc:将 DateTime 按照指定部分进行截断,截断后的部分使用 0 填充

-- 这里按小时截断,截断后的部分直接丢弃或者用 0 填充,所以会得到 2020-08-21 12:00:00
WITH toDateTime('2020-08-21 12:22:33') AS v
SELECT v, dateTrunc('hour', v);
/*
┌───────────────────v─┬─dateTrunc('hour', v)─┐
│ 2020-08-21 12:22:33 │  2020-08-21 12:00:00 │
└─────────────────────┴──────────────────────┘
*/

-- 总共可以按照 year、quarter、month、week、day、hour、minute、second 进行截断
WITH toDateTime('2020-08-21 12:22:33') AS v
SELECT dateTrunc('year', v) year_trunc, 
       dateTrunc('month', v) month_trunc, 
       dateTrunc('quarter', v) quarter_trunc,
       dateTrunc('day', v) day_truc, 
       dateTrunc('minute', v) minute_trunc
/*
┌─year_trunc─┬─month_trunc─┬─quarter_trunc─┬────────────day_truc─┬────────minute_trunc─┐
│ 2020-01-01 │  2020-08-01 │    2020-07-01 │ 2020-08-21 00:00:00 │ 2020-08-21 12:22:00 │
└────────────┴─────────────┴───────────────┴─────────────────────┴─────────────────────┘
*/

1.12 dateAdd和dateSub

dateAdd、dateSub:给 DateTime、Date 加/减 一个时间间隔

WITH toDateTime('2017-08-21 12:22:33') AS v
SELECT v, dateAdd(YEAR, 3, v), dateAdd(YEAR, -3, v);
/*
┌───────────────────v─┬─plus(v, toIntervalYear(3))─┬─plus(v, toIntervalYear(-3))─┐
│ 2017-08-21 12:22:33 │        2020-08-21 12:22:33 │         2014-08-21 12:22:33 │
└─────────────────────┴────────────────────────────┴─────────────────────────────┘
*/

dateSub 的用法与之一样,其实当 dateAdd 加的时间间隔为负数时,等同于 dateSub。时间间隔的单位可以是 year、quarter、month、week、day、hour、minute、second,并且除了使用函数之外,我们也可以直接相加。

--  v + INTERVAL 3 YEAR 等价于  v - INTERVAL -3 YEAR
WITH toDateTime('2017-08-21 12:22:33') AS v
SELECT v, v + INTERVAL 3 YEAR, v + INTERVAL -3 YEAR;
/*
┌───────────────────v─┬─plus(v, toIntervalYear(3))─┬─plus(v, toIntervalYear(-3))─┐
│ 2017-08-21 12:22:33 │        2020-08-21 12:22:33 │         2014-08-21 12:22:33 │
└─────────────────────┴────────────────────────────┴─────────────────────────────┘
*/

1.13 dataDiff

dataDiff:计算两个 DateTime、Date 的差值

WITH toDateTime('2017-08-21 12:22:33') AS v1, 
toDateTime('2018-09-15 11:44:55') AS v2
SELECT dateDiff('YEAR', v1, v2), dateDiff('MONTH', v1, v2), 
dateDiff('HOUR', v1, v2);

/*
┌─dateDiff('YEAR', v1, v2)─┬─dateDiff('MONTH', v1, v2)─┬─dateDiff('HOUR', v1, v2)─┐
│                        1139359 │
└──────────────────────────┴───────────────────────────┴──────────────────────────┘
*/

1.14 now

now:返回当前的 DateTime

-- 默认是本地时区,当然我们也可以手动指定
SELECT now(), now('Asia/Shanghai'), now('UTC');
/*
┌───────────────now()─┬─now('Asia/Shanghai')─┬──────────now('UTC')─┐
│ 2021-09-07 12:27:31 │  2021-09-07 12:27:31 │ 2021-09-07 04:27:31 │
└─────────────────────┴──────────────────────┴─────────────────────┘
*/

1.15 today和yesterday

today:返回当前的 Date,类似于 toDate( now() )
yesterday:前一天,类似于 today() - INTERVAL 1 DAY

SELECT today(), yesterday(), today() - INTERVAL 1 DAY;
/*
┌────today()─┬─yesterday()─┬─minus(today(), toIntervalDay(1))─┐
│ 2021-09-07 │  2021-09-06 │                       2021-09-06 │
└────────────┴─────────────┴──────────────────────────────────┘
*/

1.16 toYYYYMM

toYYYYMM:将 DateTime、Date 使用整型表示,保留到月

SELECT toYYYYMM(toDate('2020-11-11'));
/*
┌─toYYYYMM(toDate('2020-11-11'))─┐
│                         202011 │
└────────────────────────────────┘
*/

-- 同理还有 toYYYYMMDD 和 toYYYYMMDDhhmmss
SELECT toYYYYMMDD(toDate('2020-11-11'));
/*
┌─toYYYYMMDD(toDate('2020-11-11'))─┐
│                         20201111 │
└──────────────────────────────────┘
*/

SELECT toYYYYMMDDhhmmss(toDateTime('2020-11-11 12:12:12'));
/*
┌─toYYYYMMDDhhmmss(toDateTime('2020-11-11 12:12:12'))─┐
│                                      20201111121212 │
└─────────────────────────────────────────────────────┘
*/

1.17 formatDateTime

formatDateTime:讲一个 DateTime、Date 格式化成字符串

SELECT formatDateTime(toDateTime('2020-01-01 11:11:11'), '%F');
/*
┌─formatDateTime(toDateTime('2020-01-01 11:11:11'), '%F')─┐
│ 2020-01-01                                              │
└─────────────────────────────────────────────────────────┘
*/

SELECT formatDateTime(toDateTime('2020-01-01 11:11:11'), '%Y年%m月%d日 %H时%M分%S秒');
/*
┌─formatDateTime(toDateTime('2020-01-01 11:11:11'), '%Y年%m月%d日 %H时%M分%S秒')─┐
│ 2020年01月01日 11时11分11秒                                                    │
└────────────────────────────────────────────────────────────────────────────────┘
*/

函数不难,主要是一些格式符号我们需要记忆,以下是一些常见的格式符号:

%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

1.18 dateName

dateName:返回 DateTime 指定部分,得到的是字符串

WITH toDateTime('2020-09-17 11:22:33') AS v
SELECT dateName('year', v), dateName('month', v), dateName('quarter', v);
/*
┌─dateName('year', v)─┬─dateName('month', v)─┬─dateName('quarter', v)─┐
│ 2020                │ September            │ 3                      │
└─────────────────────┴──────────────────────┴────────────────────────┘
*/

1.19 FROM_UNIXTIME

FROM_UNIXTIME:将一个时间戳转成时间

-- 默认转换的格式是 年-月-日 时:分:秒,当然我们也可以指定格式
SELECT FROM_UNIXTIME(1600312953), FROM_UNIXTIME(1600312953, '%F %R');
/*
┌─FROM_UNIXTIME(1600312953)─┬─FROM_UNIXTIME(1600312953, '%F %R')─┐
│       2020-09-17 11:22:33 │ 2020-09-17 11:22                   │
└───────────────────────────┴────────────────────────────────────┘
*/

1.20 toUnixTimestamp

toUnixTimestamp:将一个 DateTime、Date 转成时间戳

-- 里面除了字符串,也可以传递 DateTime、Date
SELECT toUnixTimestamp('2020-09-17 11:22:33');
/*
┌─toUnixTimestamp('2020-09-17 11:22:33')─┐
│                             1600312953 │
└────────────────────────────────────────┘
*/

-- 同时也可以指定时区,默认使用本地时区,
-- UTC 时区的 2020-09-17 11:22:33 相当于 Asia/Shanghai 时区的 2020-09-17 19:22:33 
SELECT toUnixTimestamp('2020-09-17 11:22:33', 'UTC') v1, 1600312953 + 8 * 3600;
/*
┌─────────v1─┬─plus(1600312953, multiply(8, 3600))─┐
│ 16003417531600341753 │
└────────────┴─────────────────────────────────────┘
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内聚力模型

背景介绍 材料中不可避免的具有各种缺陷,引起工程中结构断裂的发生。针对裂纹扩展相关问题,研究学者基于线弹性断裂力学,通过理论或数值手段得到裂纹尖端的应力强度因子KI、KII 和 KIII 以及应变能释放率GI、GII 和 GIII,对裂纹的…

C++入门(1)

一、关键字 C语言中只有32个关键字,C有63个关键字,将近翻了一倍。 二、命名空间 在编写代码的时候,会遇到定义的变量名和库中的函数名重复,出现命名冲突的情况。在C中有变量名、函数名还有类名,这些都会存在全局域…

两种方式实现websocket获取数据库查询进度

两种方式实现websocket获取数据库查询进度 本文实现了两种方式用websocket连接实现前端通过API获取数据库查询进度,作为websocket初步学习的参考 内容目录概要: 使用额外接口获取指定数据库查询进度,查询进度的接口与获取数据的接口分开实…

SAP S4 FI后台详细配置教程- PART3 (财务凭证相关配置篇)

本篇主要介绍凭证相关的配置,希望对学习SAP财务的同学有帮助。 1、定义凭证类型 概念功能说明: • 凭证类型是区分不同交易类型的方法并决定能够被过帐的会计形式。 例如, 可将所有的会计凭证按业务类分成: 总帐凭证、收款…

基础选择器

一、任务目标 掌握基础选择器的应用 二、任务背景 CSS(层叠样式表)选择器是CSS规则的一部分,用来指定需要设置样式的HTML元素。通过选择器可以实现CSS对HTML元素的一对一、一对多、多对一的控制。 三、任务内容 选择器类型 描述 示例 通配选…

概率论基础

一、条件概率的三大公式 条件概率中的条件就代表观测变量,观测变量意思就是这个变量的取值是否已经定下来了 1.乘法公式 2.全概率公式 随机现象:在一定的条件下,并不总出现相同结果的现象称为随机现象。随机现象的各种结果会表现出一定的…

分类效果评价(机器学习)

目录 准确率 精确率(precision) 召回率(recall,也称为查全率) 调回平均 对于一般分类问题,有训练误差、泛化误差、准确率、错误率等指标 对于常见的二分类问题,样本只有两种分类结果,将其定义为正例与反例。 那么在进行分类…

基于java大学生就业信息管理系统

随着高校教育体制的改革大学生人数的不断增加,毕业生就业制度发生了根本的变化。单位和学生走向人才市场,双向选择,择优录用。因此在这样的情况下,在INTERNET上开发并运行信息管理系统就能够极大地提高工作效率,弥补了…

VMware 网络模式

VMware提供了三种网络工作模式,它们分别是: Bridged(桥接模式) NAT(网络地址转换模式) Host-Only(仅主机模式) 1、桥连接模式 【NAT 设置】【DHCP 设置】不可编辑 2、仅主机模式 【自…

MySQL并发事务会引起的问题

MySQL事务并发的问题主要分为以上三种 脏读: 比如 事务A 对用户表进行了 一次查询 和一次修改 他将用户1的 部门 从 部门1 改为了 部门2 但事务A 并没有提交 然后事务B 只做了一步查询 查用户表 此时 如果出现脏读 则 事务B查到的 用户1 的所属部门是 部门2 而 这是 事务A其实…

Python画小仓鼠

肉嘟嘟的小动物很是可爱,本文介绍运用Python中的turtle库控制函数绘制小仓鼠。    文章目录一、效果展示二、代码详解1 导入库2 播放音乐3 定义画小仓鼠头的函数4 定义画左眼和右眼的函数5 定义画嘴的函数一、效果展示 在介绍代码之前,先来看下本文的实…

mPEG-Dendro Azide,mPEG-Dendro N3,甲氧基聚乙二醇树状叠氮化物bisMPA树状大分子供应

1、名称 英文:mPEG-Dendro Azide,mPEG-Dendro N3 中文:甲氧基-聚乙二醇-树状叠氮化物 2、CAS编号:N/A 3、所属分类: Azide PEG Methoxy PEG 4、分子量:可定制,甲氧基-PEG-树状叠氮化物 200…

Linux下文件和目录的基础操作

文章目录一、Linux 下文件和目录的特点二、 计算机中文件大小的表示方式三、 ls 命令四、切换目录五、 相对路径和绝对路径六、创建和删除1、touch 创建文件2、mkdir 创建目录3、rm 删除文件和目录七、 查看、移动和复制文件1、tree 浏览目录结构2. cp 复制文件和目录3. mv 移动…

Linux下C/C++实现以十六进制的形式显示命令(xxd)

如果你需要在linux文本文件的十六进制转储?且正在寻找可以执行此操作的命令行实用程序,xxd的命令可以为你做这件事。xxd命令将文件显示为十六进制值和ASCII表示,并允许对其进行编辑。 xxd - 以十六进制形式表示 xxd程序接受文件或标准输入&…

python--函数

目录函数1.1 自定义函数1.2 调用函数1.3 作用域函数 1.1 自定义函数 无参数、无返回值 def function():表达式无参数、有返回值 def function():表达式return 需返回的值tips:函数中可以有多个return语句,但是只要执行一个return语句,就意…

PPT+Visio复现顶刊三维流程图

复现 论文中的图3,改图是研究流程,主要讲了神经网络的流程。 A future land use simulation model (FLUS) for simulating multiple land use scenarios by coupling human and natural effects https://doi.org/10.1016/j.landurbplan.2017.09.019 1.…

【Touchstone 1.02.0数据格式解析】

Touchstone 1.0&2.0数据格式解析 在进行S参数仿真时,一般存储的S参数模型为SnP格式,如双端口模型为S2P格式,四端口模型为S4P格式。了解SnP格式的具体要求,对于S参数的应用具有重要作用。 本质上,S参数是由S参数矩…

对比Python,PySpark 大数据处理其实更香

对于数据分析师、数据科学家和任何使用数据的人来说,能够熟练而有效地处理大数据是一项非常有优势的技能。 如果你已经熟悉运用 Python 和 pandas 做常规数据处理,并且想学习处理大数据,那么熟悉 PySpark,并将用其做数据处理&…

免费搜题系统搭建

免费搜题系统搭建 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击跳…

C语言详细知识点复习(上)

文章目录一、C语言概述1、C语言的主要特点2、算法的概念及特点二、C程序设计的基础语法1、常量和变量2、数据类型3、运算符和表达式4、C 语句5、数据的输入和输出三、选择结构四、循环结构1、循环结构2、break\continue3、循环程序举例一、C语言概述 1、C语言的主要特点 程序…