【Databand】日期时间函数

文章目录

    • 获取当前日期和时间
    • 日期格式化函数
    • 日期加减运算
    • 日期时间和时间戳转化
    • 日期时间各部分拆分
    • 日期时间加减运算
    • 实际应用扩展
    • 总结

获取当前日期和时间

Databend 使用 UTC 作为默认时区,并允许您将时区更改为当前地理位置。

-- 查看时区
select timezone();
+-----------------+
| timezone()      |
+-----------------+
| UTC             |
+-----------------+
-- 修改时区
set timezone='asia/shanghai';

Databend 常见的获取当前日期和时间函数如下:

  • now() 返回 timestamp 数据类型,以“YYYY-MM-DD hh:mm:ss.fff”格式返回当前日期和时间。
  • today() 返回 date 数据类型,以“YYYY-MM-DD”格式返回当前日期。
  • yesterday() 返回 date 数据类型,以“YYYY-MM-DD”格式返回昨天日期,与 today() - 1 相同。
  • tomorrow() 返回 date 数据类型,以“YYYY-MM-DD”格式返回明天日期,与 today() + 1 相同。
select now(),today(),yesterday(),tomorrow(),today()+1 as tomorrow;
+-------------------------+-------------+--------------+-------------+------------+
|           now()         |   today()   | yesterday()  |  tomorrow() |  tomorrow  |
+-------------------------+-------------+--------------+-------------+------------+
| 2024-01-08 22:19:55.188 | 2024-01-08  |  2024-01-07  |  2024-01-09 | 2024-01-09 |
+-------------------------+-------------+--------------+-------------+------------+

日期格式化函数

使用 to_date(expr[,format_text]) 可以将表达式转化为指定日期格式,转化为“YYYY-MM-DD”格式。如果给定两个参数,该函数会根据第二个字符串中指定的格式将第一个字符串转换为日期。语法和示例如下:

-- 语法
to_date(expr[,format_text]) 
-- 示列
select to_date('2023-12-13') as dt;-- 转化日期成功
select to_date('20231213') as dt;-- 报错,不能转化,格式不对
select to_date('20231213','%Y%m%d') as dt;-- 转化日期成功
select to_date('2023/12/13','%Y/%m/%d') as dt;-- 同理,需要指定格式才能转化日期成功
select to_date(null) as dt;-- 输出 NULL,但是不建议日期显示 NULL,因为会存在问题
select to_date(ifnull(null,1)) as dt;-- 优化后,输出 1970-01-02,
-- 如果同一列中日期存在多种格式怎么处理?
with t as(select '2023-12-13' as dtunion allselect '2023/12/13' as dtunion allselect '20231213' as dtunion allselect '2023/12/13 00:00:00' as dtunion allselect null as dt)
select dt,casewhen length(dt) = 8 then to_date(dt, '%Y%m%d')when length(dt) = 10 and dt like '%/%' then to_date(dt, '%Y/%m/%d')when length(dt) = 10 and dt like '%-%' then to_date(dt, '%Y-%m-%d')when length(dt) > 10 and dt like '%/%' then to_date(dt, '%Y/%m/%d %H:%M:%S')else to_date(ifnull(dt, 1)) end as d_std
from t;
+---------------------+------------+
|           dt        |   dt_std   |
+---------------------+------------+
|          NULL       | 1970-01-02 |
+---------------------+------------+
| 2023/12/13 00:00:00 | 2023-12-13 |
+---------------------+------------+
|        20231213     | 2023-12-13 |
+---------------------+------------+
|       2023/12/13    | 2023-12-13 |
+---------------------+------------+
|       2023-12-13    | 1970-01-02 |
+---------------------+------------+

上面存在多种格式处理过程中,如果对 NULL 不进行处理,可能会得不出来结果,或者得出的结果显示错误,如下图:
在这里插入图片描述

由此可见,Databend 日期处理函数语法和 Mysql 差异还是很大的,对于 Mysql 上面不管任何格式的日期,只要 date() 函数就能统一规范处理,而 Databend 则要针对不同的格式写不同的处理方式,这说明 Databend 对数据类型要求非常严格,在任何时候,不管是数据接入人员,亦或是数据开发人员,在建表过程中,设计字段都应指定准确的数据类型。

使用 date_formt() 函数也可以格式化日期,但是只能格式化数据类型为date的表达式,即将日期值转换为特定的字符串格式。语法和示例如下:

-- 语法
date_format(<date>, <format>)
-- 示例
select date_format('20231213','%Y/%m/%d');-- 报错,原因是20231213不是日期类型!
select date_format(to_date('20231213','%Y%m%d'),'%Y/%m/%d');-- 输出 2023/12/13

日期加减运算

使用 date_add() 函数对日期进行添加运算,返回与<date_or_time_expr>参数类型相同的值。语法:

date_add(<unit>, <value>,  <date_or_time_expr>)

参数解释如下:

  • :必须具有以下值 year、quarter、month、day、hour、minute 和 second。
  • :添加的时间单位数,value 可以为负数,相当于 date_sub() 函数。
  • <date_or_time_expr>:date 或 timestamp 类型的值。

使用 date_sub() 函数对日期进行减少运算,返回与 <date_or_time_expr> 参数类型相同的值。语法参数和 date_add() 函数一致。

数据示例:

select date_add(year, -1, now())  as up_year_time, date_add(day, 1, today())  as up_day, date_add(day, -1, today()) as down_day, date_sub(day, 1, today())  as down_day, date_sub(day, -1, today()) as up_day
;
+--------------------------+------------+------------+------------+------------+
|      up_year_time        |   up_day   | down_day   | down_day   |   up_day   |
+--------------------------+------------+------------+------------+------------+
| 2023-01-09 07:29:00.980  | 2024-01-09 | 2024-01-07 | 2024-01-07 | 2024-01-09 |
+--------------------------+------------+------------+------------+------------+

根据定义和示例,date_add() 和 date_sub() 函数掌握使用一个即可。

使用 date_trunc() 函数将日期、时间或时间戳值截断到指定的精度。语法:

date_trunc(<precision>, <date_or_time_expr>)

参数解释如下:

  • <precision>:必须具有以下值 year、quarter、month、day、hour、minute 和 second。
  • <date_or_time_expr>:date 或 timestamp 类型的值。

数据示例:

select today()                                            as dt, date_trunc(month, today())                         as cur_month_begin_dt, date_add(month, 1, date_trunc(month, today()) - 1) as cur_month_end_dt
;
+------------+--------------------+------------------+
|      dt    | cur_month_begin_dt | cur_month_end_dt | 
+------------+--------------------+------------------+
| 2024-01-08 |     2024-01-01     |   2024-01-31     |
+------------+--------------------+------------------+

通过 date_trunc() 和 date_add() 函数搭配使用,可以很好地计算出月初和月末。

日期时间和时间戳转化

使用 to_timestamp() 函数返回格式为“YYYY-MM-DD hh:mm:ss.fff”格式的时间戳。如果给定的字符串与此格式匹配,但没有时间部分,则会自动扩展到此模式。填充值为0。如果给定Unix时间戳,也会转化为日期时间格式。

select now(),to_timestamp(now());-- 报错,原因是 to_timestamp() 只对字符串转化!!!
select now(),to_timestamp(now()::vrchar) as t1,to_timestamp(1) as t2;
+-------------------------+-------------------------+-------------------------+
|           now()         |           t1            |             t2          | 
+-------------------------+-------------------------+-------------------------+
| 2024-01-09 10:32:07.783 | 2024-01-09 10:32:07.783 | 1970-01-01 08:00:01.000 |
+-------------------------+-------------------------+-------------------------+

使用 to_unix_timestamp() 函数将日期/时间格式的时间戳转换为Unix时间戳格式。Unix时间戳表示自 1970年1月1日00:00:00 UTC 以来经过的秒数。

select now(),to_unix_timestamp(now()) as unix,to_timestamp(1704767748) as t1;
+-------------------------+------------+-------------------------+
|           now()         |    unix    |             t2          | 
+-------------------------+------------+-------------------------+
| 2024-01-09 10:38:12.318 | 1704767892 | 2024-01-09 10:35:48.000 |
+-------------------------+------------+-------------------------+

日期时间各部分拆分

使用 extract() 都可以检索出日期、时间或时间戳的指定部分,语法类似如下:

extract( year | quarter | month | week | day | hour | minute | second | dow | doy from <date_or_time_expr> )

其中,dow 表示一周的一天,1表示周一,7表示周日。doy 表示一年中的第几天。

除了上面两个函数外,Databend 还有一些函数也能实现效果,如下:

  • to_year():将带有时间(时间戳/日期时间)的日期或日期转换为年份数字。
  • to_month():将带有时间(时间戳/日期时间)的日期或日期转换为月份数字。
  • to_quarter():将带有时间(时间戳/日期时间)的日期或日期转换为季度数字。
  • to_week_of_year():计算给定日期一年内的周数。
  • to_day_of_month():将带有时间的日期或日期(时间戳/日期时间)转换为包含月份天数(1-31)的UInt8数字。
  • to_day_of_week():将带有时间的日期或日期(时间戳/日期时间)转换为包含一周中日数的UInt8数字(周一为1,周日为7)。
  • to_day_of_year():将日期或带有时间的日期(时间戳/日期时间)转换为包含一年中一天数字的UInt16数字(1-366)。
  • to_hour():将带有时间(时间戳/日期时间)的日期转换为包含24小时时间(0-23)小时数的UInt8数字。
  • to_minute():将带有时间的日期(时间戳/日期时间)转换为包含小时分钟数(0-59)的UInt8数字。
  • to_second():将带有时间(时间戳/日期时间)的日期转换为包含分钟中秒数(0-59)的UInt8数字。

数据示例:

select now()                      as now_dt, extract(year from now())   as year_dt
-- ,extract(quarter from now())
-- ,extract(week from now())
-- ,to_week_of_year(now()), extract(doy from now())    as day_of_year1, to_day_of_year(now())      as day_of_year2, extract(day from now())    as day_of_month, to_day_of_month(now())     as day_of_month2, extract(dow from now())    as day_of_week1, to_day_of_week(now())      as day_of_week2, extract(hour from now())   as hour_dt, extract(minute from now()) as minute_dt, extract(second from now()) as second_dt
;

其中,被注释掉的官网虽然有函数语法,但是实际应用还不支持,但并不影响。

Databend 还有些其他函数扩展,可能有时候能用上。

  • to_yyyymm():将带有时间的日期或日期(时间戳/日期时间)转换为包含年份和月份编号的UInt32编号。
  • to_yyyymmdd():将带有时间(时间戳/日期时间)的日期或日期转换为包含年份和月份编号(YYYY 10000 + MM 100 + DD)的UInt32数字。
  • to_yyyymmddhhmmss():将带有时间(时间戳/日期时间)的日期或日期转换为包含年份和月份编号的UInt64数字(YYYY 10000000000 + MM 100000000 + DD 1000000 + hh 10000 + mm * 100 + ss)。

日期时间加减运算

前面介绍了 date_add() 和 date_sub() 函数,也可以使用他们对日期时间做加减运算。除此之外,Databend 有新的函数也可以适用,将时间间隔添加到日期或时间戳中,返回日期或时间戳类型的结果。

  • add_years()
  • add_quarters()
  • add_months()
  • add_days()
  • add_hours()
  • add_minutes()
  • add_seconds()
select add_years(now(), -1), add_quarters(now(), 1), add_months(now(), 1), add_days(now(), 1), add_hours(now(), 1), add_minutes(now(), 1), add_seconds(now(), 1), date_add(year, 1, now()), date_add(quarter, 1, now()), date_add(month, 1, now()), date_add(day, 1, now()), date_add(hour, 1, now()), date_add(minute, 1, now()), date_add(second, 1, now())
;

根据示例可知,添加时间单位数可正数也可负数,其实 Databend 远不止这些函数,还有很多,但是我们只要选择最常用 date_add() 函数就能解决所有相关日期时间加减运算问题。

实际应用扩展

利用当前时间,自动生成文件名,减少手动书写带来的错误。

select concat('guanfa_wang_',LEFT(to_yyyymmddhhmmss(add_minutes(now(),15))::varchar,12),'.sql') as file_name;
+------------------------------+
|            file_name         |
+------------------------------+
| guanfa_wang_202401091336.sql |
+------------------------------+

计算时间间隔。

select cur_create_time, create_time, (to_unix_timestamp(cur_create_time) - to_unix_timestamp(create_time))           as second_gap, round((to_unix_timestamp(now()) - to_unix_timestamp(create_time)) / 60, 0)      as minute_gap, round((to_unix_timestamp(now()) - to_unix_timestamp(create_time)) / 60 / 60, 0) as hour_gap
from (select now()                     as cur_create_time, date_add(hour, -8, now()) as create_time) as t1;
+-------------------------+-------------------------+------------+------------+------------+
|    cur_create_time      |        create_time      | second_gap | minute_gap |  hour_gap  |   
+-------------------------+-------------------------+------------+------------+------------+
| 2024-01-09 13:37:12.408 | 2024-01-09 05:37:12.408 |    28800   |     480    |     8      |
+-------------------------+-------------------------+------------+------------+------------+

总结

本文基本覆盖了数据库中所有关于日期时间类计算,学习掌握常用的几种即可,函数都是定义出来的,主要是多去思考逻辑。如果你觉得掌握了以上函数应用,感兴趣的话可以操作实践一下 Databend 生成日期表,可参考 MySQL 日期表制作。

参考资料:

  • Databend Date & Time Functions:https://databend.rs/sql/sql-functions/datetime-functions/
  • MySQL 日期表制作:https://blog.csdn.net/weixin_50357986/article/details/133815732

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

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

相关文章

【Java开发工具】windows和mac多版本JDK 安装指南:让你在开发中轻松应对不同版本需求

解决思路 通过动态修改JDK环境变量中的JAVA_HOME 将值改成相应的JDK安装目录&#xff0c;来达到在同一电脑中安装不同版本jdk的效果。 windows系统 安装的jdk目录 右键→属性→高级系统设置→高级→环境变量→系统变量。 新建4个系统变 量变量值,变量名分别为&#xff1a…

statsmodels.tsa 笔记 detrend(去趋势)

1 基本使用方法 statsmodels.tsa.tsatools.detrend(x, order1, axis0) 2 参数说明 x数据。如果是二维数组&#xff0c;那么每一行或每一列将独立地去除趋势&#xff0c;但趋势的阶数是一样的。order趋势的多项式阶数。0 表示常数趋势&#xff08;即没有趋势&#xff09;&…

kubernetes Adminssion Webhook 准入控制器 (ImagePolicyWebhook)

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 介绍 原理 流程 Admission Webhook 准入控制器Vebhook是准入控制插件的一种&#xff0c;用于拦截所有向APISERVER发送的…

超声波清洗机是智商税吗?哪些超声波清洗机值得买?这些值得入手

自打超声波清洗机问世以来&#xff0c;就有非常多朋友会有这个疑问&#xff01;超声波清洗机到底是不是智商税呢&#xff1f;其实不光是大家&#xff0c;一开始我也有这个疑问&#xff0c;但是通过了解了超声波清洗机的一些工作原理之后&#xff0c;会发现&#xff0c;其实超声…

服务器组网方案

在当今数字化时代&#xff0c;服务器组网方案不仅是企业信息管理的关键&#xff0c;更是支撑业务运作的核心架构 。为了实现高效的数据处理和存储&#xff0c;服务器组网方案成为企业不可或缺的一部分。本文将深入探 讨服务器组网方案的核心要素和实施策略&#xff0c;明确其在…

RTMP vs SRT:延迟与最大带宽的比较

引言 文来自Haivision的白皮书&#xff0c;比较了RTMP和SRT两种流媒体协议的优缺点&#xff0c;并通过实验测试了两种协议在延迟和最大带宽两方面的表现。 本文福利&#xff0c; 免费领取C音视频学习资料包学习路线大纲、技术视频/代码&#xff0c;内容包括&#xff08;音视频…

zabbix监控部署

目录 一、什么是zabbix&#xff1f; 二、zabbix监控原理 三、zabbix常见的五个程序 四、zabbix监控mysql实验 1、部署服务端 2、部署客户端 3、自定义监控内容 一、什么是zabbix&#xff1f; zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的…

如何让GPT支持中文

上一篇已经讲解了如何构建自己的私人GPT&#xff0c;这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型&#xff0c;GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品&#xff0c;llama.cpp 不再…

构建异步高并发服务器:Netty与Spring Boot的完美结合

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书…

C#之反编译之路(二)

先阅读C#之反编译之路(一)可以增加文章连续性 阅读C#之反编译之路(一) 如何快速定位代码位置 用一个小小的例子举例,用户反馈新能源车牌号无法录入,燃油车牌正常,查看日志报如下错误 拿到关键字车牌号长度错误直接反编译代码 打开dnSpy.exe→加载项目→CtrlF打开搜索框→输入…

学习笔记16——操作系统

学习笔记系列开头惯例发布一些寻亲消息&#xff0c;感谢关注&#xff01; 链接&#xff1a;https://www.mca.gov.cn/lljz/indexdetail.html?idd0afa7f6f36946319a206d61937f9b63&type0&t10.11199120579373845 八股——操作系统一些基础知识整理 一个java程序对应一个…

极海APM32F003通过IEC 60730/60335功能安全认证,为产品安全保驾护航

近日&#xff0c;极海APM32F003系列工业级超值型MCU&#xff0c;已顺利通过IEC 60730/60335功能安全认证&#xff0c;并可提供符合CLASS B标准的功能安全设计套件&#xff0c;有助于客户减少认证时间与成本&#xff0c;快速推出稳定可靠的终端产品。 *VDE是德国的一个权威性电气…

Spring - 配置支持多数据源

目录 SpringBoot整合多数据源整合步骤具体整合步骤如下&#xff1a;1、在application.properties中配置出多个数据源2、在代码中创建出mapper目录&#xff0c;在mapper目录下创建出不同数据源的目录创建出目录MySQL数据源的MapperSQL Server数据源的Mapper 3、创建config packa…

Excel:通过excel将表数据批量转换成SQL语句

这里有一张表《student》&#xff0c;里面有10条测试数据&#xff0c;现在将这10条测试数据自动生成 insert语句&#xff0c;去数据库 批量执行 P.S. 主要用到excel表格中的 CONCATENATE函数&#xff0c;将单元格里面的内容填入到sql里面对应的位置 1. 先写好一条insert语句&a…

Vue使用printJS导出网页为pdf、printJS导出pdf

先放几个参考链接 感谢&#xff01; Vue使用PrintJS实现页面打印功能_vue print.js 设置打印pdf的大小-CSDN博客 前台导出pdf经验汇总 &#xff08;html2canvas.js和浏览器自带的打印功能-print.js&#xff09;以及后台一些导出pdf的方法_iqc后台管理系统怎么做到导出pdf-CSD…

使用fs.renameSync(oldPath,newPath)方法,报错Error: EPERM: operation not permitted

出错翻译&#xff1a;表示操作被拒绝&#xff0c;因为当前用户没有足够的权限执行该操作。这可能是由于文件或目录 的权限设置不正确或操作系统限制所致 出现错误场景&#xff1a;使用element-plus的Upload 上传功能&#xff1b;后端使用Nodejs提供的fs.renameSync(oldPath,ne…

可碧教你C++——位图

本章节是哈希的延申 可碧教你C——哈希http://t.csdnimg.cn/3R8TU 一文详解C——哈希 位图 位图是基于哈希表的原理产生的一种新的container——bitset 基于哈希映射的原理&#xff0c;我们在查找的时候&#xff0c;可以直接去定址到元素的具体位置&#xff0c;然后直接访问该…

OpenAI ChatGPT-4开发笔记2024-04:Chat之Tool之2:multiple functions

从程序员到ai Expert 1 定义参数和函数2 第一轮chatgpt3 第一轮结果和function定义全部加入prompt再喂给chatgpt4 大结局7 参考资料 上一篇解决了调用一个函数的问题。这一篇扩展为调用3个。n个自行脑补。 1 定义参数和函数 #1.设定目标 import json import openai#1.定义para…

基于JavaWeb+BS架构+SpringBoot+Vue协同推荐的黔醉酒业白酒销售系统的设计和实现

基于JavaWebBS架构SpringBootVue基于协同推荐的黔醉酒业白酒销售系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1.2 国内外研究概况 2 1.3 研究的内容 2 1.4 本章…

mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

文章目录 场景使用JacksonTypeHandler实现类型转换自定义StringListTypeHandler处理器实现 场景 项目中经常需要将List转成json存储到配置文件中, mybatisPlus默认实现了JacksonTypeHandler&#xff0c;GsonTypeHandler&#xff0c;FastjsonTypeHandler&#xff0c;也可以自定义…