草庐IT

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

fanstuck 2023-04-13 原文

目录

前言

一、时间函数

1.取当前时间

now()

 today()

 获取当前时间戳

 2.取年月日季度

toYear()

toMonth()

toDayOfMonth()

获取季度toQuarter()

3.日期转化

 日期化为天数

 当天日期所在当月周数

 4.获取起始时间

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

二、时间格式转换函数

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

2.toYYYYMM()类型

化为时间戳形式toUnixTimestamp():

 三、时间数据类型转换

toDateTime()

 toDate()

四、时间运算函数

1.interval

 2.add增加时间

 3.subtract减去时间

4.时间差值 dateDiff()

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

参阅



前言

Clickhouse是一个面向联机分析处理(OLAP)的开源的面向列式存储的DBMS,简称CK, 与Hadoop, Spark相比,ClickHouse很轻量级,由俄罗斯第一大搜索引擎Yandex于2016年6月发布, 开发语言为C++。主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。

时间在数据库中经常作为时间索引,在数据入库和出库以及更新的时候都需要变化。在一些指标计算或者是提取某段时间的数据时,都会根据数据库中的时间索引数据进行操作。因此很大一部分我们操作数据都得先从时间数据下手,但是想要真正提取到我们想要的时间作为索引,还需要我们掌握许多功能函数方便我们操作,这是一个比较复杂的运用过程。因此特地写下这篇文章,记录一些十分好用常用的处理Clickhouse数据库SQL时间数据的函数,以及实例运用这些函数完成一些复杂查询任务。希望能够帮助到正在看此博文的各位,如果还有什么问题解决不了尽请在评论区提出,博主会一一作答。

关于MySQL的时间函数可以看博主的前篇文章相当详细了:

一文速学-玩转MySQL时间运算函数以及时间匹配操作详解+实例代码

 一文速学-玩转MySQL时间选取各类函数操作详解+实例代码

 一文速学-玩转MySQL获取时间、格式转换各类操作方法详解


一、时间函数

和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()

SELECT
    now() AS time

 today()

SELECT
    today() AS time

 获取当前时间戳

SELECT
    toUnixTimestamp(now()) AS time

 2.取年月日季度

toYear()

SELECT
    toYeara(now()) AS time

toMonth()

SELECT
    toMonth(now()) AS time

 

toDayOfMonth()

SELECT
    toDayOfMonth(now()) AS time

获取季度toQuarter()

SELECT
    toQuarter(now()) AS time

out:3 

3.日期转化

 日期化为天数

SELECT
    toDayOfYear(now()) AS time

 当天日期所在当月周数

SELECT
    toDayOfWeek(now()) AS time

 4.获取起始时间

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

SELECT
    toStartOfDay(now()) AS time

 

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

二、时间格式转换函数

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分钟,数值(00-59)
%m月,数值(00-12)
%pAM 或 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 位

用法代码:

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

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

2.toYYYYMM()类型

该类型有三个:

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

化为时间戳形式toUnixTimestamp():

SELECT
    toUnixTimestamp(now()) AS time

 三、时间数据类型转换

toDateTime()

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

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

 toDate()

SELECT
    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

 

 2.add增加时间

和MySQL的date_add是一样的,给出列表均已测试:

代码描述
addYears(<时间>,<数值>)增加<数值>年份
addMonths(<时间>,<数值>)增加<数值>月份
addWeeks(<时间>,<数值>)增加<数值>周数
addDays(<时间>,<数值>)增加<数值>天数
addHours(<时间>,<数值>)增加<数值>小时
addMinutes(<时间>,<数值>)增加<数值>分钟
addSeconds(<时间>,<数值>)增加<数值>秒数
addQuarters(<时间>,<数值>)增加<数值>季度

代码使用展示:

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

 3.subtract减去时间

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

SELECT
    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'。

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。


参阅

Clickhouse 时间日期函数实战(详细)

clickhouse的常用日期函数

有关Clickhouse时间日期函数一文详解+代码展示的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  5. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  6. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  7. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  10. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

随机推荐