PG实践|内置函数之GENERATE_SERIES之深入理解(二)

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~

文章目录

  • 背景
  • 1GENERATE_SERIES
    • 1.1 释义
    • 1.2 用法
      • 1.2.1 日期类型加减法
      • 1.2.2 时间戳类型加减法
      • 1.2.3 在时空下的日期时间加减法
  • 总结

背景

接着上一篇,这次继续深入聊聊 GENERATE_SERIES 这个函数的其他用法,由于最近一直忙于工作,也没得时间来深入学习、使用这个函数,每次都是潦草学习,终不得要领,所以得闲的时候就来写一写,学习一下。
近期在做一些数据处理的工作,工作中使用其他项目组平台来做数据开发,在数据开发过程中,使用了PostgreSQL的一个内置函数 GENERATE_SERIES。在使用过程中遇到问题,一般都是站在巨人的肩膀学习即可,也无需动脑子,慢慢的成了拿来主义者。
闲话家常里短这里就不拉了,继续上一篇的学习,下面开始吧。

1GENERATE_SERIES

1.1 释义

【函数释义】:数据集函数,按照一定参数规则返回数据集。主要用于生成示例数据或一些有规律的记录,generate_series允许您生成一组从某个点开始,到另一个点结束的数据,并可选择设置递增值。

当前测试(实验)环境为PostgreSQL 16.2,所有操作均以这个版本进行测试(这个后续会有说明)。
在这里插入图片描述

1.2 用法

上一篇也说过,在PostgreSQL的官网有如下三种的用法和描述(integer、bigint、numeric),可以借鉴下上一篇,这里说下日期类型参数。

【语法结构】

generate_series ( start timestamp, stop timestamp, step interval ) →
setof timestamp

generate_series ( start timestamp with time zone, stop
timestamp with time zone, step interval [, timezone text ] ) → setof
timestamp with time zone

【参数】
在处理日期类型时,可以将日期转换为整数类型计算,也可以按照日期类型来计算。

【应用场景】
PostgreSQL中的 generate_series 函数是一个非常强大且灵活的工具,它可以在多种应用场景中生成连续的序列。

  1. 生成整数序列:上文已经讲述。
  2. 生成时间序列:本篇重点讲述。
  3. 生成IP地址序列:虽然generate_series函数本身不直接支持IP地址的生成,但可以通过一些技巧(如将IP地址转换为整数进行计算后再转换回IP地址)来间接实现。
  4. 模拟测试数据:在应用功能数据库开发或测试阶段,经常需要生成大量的测试数据。generate_series可以方便地生成连续的整数或时间序列,用于填充测试表。
  5. 批量更新或处理数据:generate_series可以与UPDATE、DELETE等语句结合使用,实现复杂的批量操作。
  6. 报表和数据分析:generate_series可以生成一个连续的时间或数值序列,用于与数据表进行连接(JOIN)操作,从而方便地进行分组和聚合。

1.2.1 日期类型加减法

在当前日期上按照一定的数值序列进行加减法,例如当前时间为 2024-07-02,从 0 (当前日期基数)开始,按照步长 1 向上增加(具体的逻辑可以参考下上一篇,逻辑相同,这里主要是借助了generate_series函数自增的特性,如果从 1 开始,那么就不算当前日期)。
2024-07-02
2024-07-03
2024-07-04
2024-07-05
2024-07-06
2024-07-07 ,不符合在数据集内,所以舍去,那么这个时间结果集就为上述所示。
在这里插入图片描述

【代码示例】

-- 在当前日期上增加数值
SELECT current_date + gs.serial_num AS dates FROM generate_series(0,4,1) AS gs(serial_num);

其他例子也挺好,可以根据自身需求来设置或制作可以使用的参数,具体可以参考如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

-- 在参数日期上增加数值(如果是在Navicat中可以执行,其他工具酌情处理修改后执行)
SELECT (CAST([${year_time}] as date) + gs.serial_num) AS dates FROM generate_series(0,4,1) AS gs(serial_num);

-- 可以在查询时直接应用数据集
SELECT generate_series('2024-07-02'::date, '2024-12-31'::date, '1 month'::interval);

-- 写法不限制,怎么写都是可以的,例如下面的方式
SELECT generate_series(CURRENT_DATE,  CURRENT_DATE + INTERVAL '6 days',  INTERVAL '1 day');

1.2.2 时间戳类型加减法

时间戳上数值加减法,这里利用了日期的周期性。例如从开始时间戳到结束时间戳,按照某一个周期进行加减法。从 2024-07-02 00:00 到 2024-07-10 00:00,按照步长 1 day 的周期进行增加后的结果如下:
从 2024-07-02 00:00:00 开始,判断在数据集内,罗列结果:
2024-07-02 00:00:00
2024-07-03 00:00:00
2024-07-04 00:00:00
2024-07-05 00:00:00
2024-07-06 00:00:00
2024-07-07 00:00:00
2024-07-08 00:00:00
2024-07-09 00:00:00
2024-07-10 00:00:00
2024-07-11 00:00:00 ,不符合在数据集内,所以舍去,那么这个时间结果集就为上述所示。
在这里插入图片描述
在这里插入图片描述

-- 时间戳上数值加减法(这里按照天计算),这里利用了日期的周期性
SELECT * FROM generate_series('2024-07-02 00:00'::timestamp, '2024-07-10 00:00', '1 day');

-- 时间戳上数值加减法(这里按照月计算)
SELECT * FROM generate_series('2024-07-02 00:00'::timestamp, '2024-10-10 00:00', '1 MONTH');

当然可以根据时间周期性计算 年、月、日、时、分、秒,关键字分别为:year、month、day、hour、minute、seconds,如果没有特别设置,不区分大小写,虽然偶尔写,有些时间也难记住这些单词,这里就不再赘述。

1.2.3 在时空下的日期时间加减法

生成从开始到停止的一系列值,步长为步长。在时区感知形式中,根据时区参数命名的时区计算一天中的时间和夏令时调整,如果省略,则根据当前的时区设置计算。一般情形下,这种使用方法很少,除非这是一些跨国业务需要处理。

SELECT * FROM generate_series(‘2024-07-02 08:00 -10:00’::timestamptz,
‘2024-07-08 10:00 -1:00’::timestamptz,
‘1 day’::interval, ‘Asia/Chungking’);

注意⚠️
1、如果不知道如何获取时区,可以查询系统中已有的时区列表,默认情况下是使用UTC。

SELECT name FROM pg_timezone_names ORDER BY name;

-- 部分数据如下
……
-- 重庆
Asia/Chongqing
Asia/Chungking
-- 香港
Asia/Hong_Kong
-- 澳门
Asia/Macau
-- 上海
Asia/Shanghai
-- 台北
Asia/Taipei
……

2、在时间区间中使用的是 12H 制度,也就是我们常说的AP和PM。

总结

遇事不要慌,多看看官网,多找找原因,实在不行多翻一翻其他的博文,总有能帮助你的那一刻。下一篇总结下其他参数的使用方法。


[引用]

  1. PostgreSQL 16(generate_series):https://www.postgresql.org/docs/16/functions-srf.html
  2. PostgreSQL 12(generate_series):https://www.postgresql.org/docs/12/functions-srf.html

欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Vue CLI方式创建Vue3.0应用程序

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统。新版本的 Vue CLI 的包名由原来的 vue-cli 改成了 vue/cli。 在开发大型项目时,需要考虑项目的组织结构、项目构建和部署等问题。如果手动完成这些配置工作,工作效率会非常低。为此,Vue.…

Rocky Linux 9 快速安装docker 教程

前述 CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 及后续版本,不再支持新的软件和补丁更新。CentOS用户现有业务随时面临宕机和安全风险,并无法确保及时恢复。由于 CentOS Stream 相对不稳定,刚好在寻找平替系统…

Python学生信息管理系统(完整代码)

引言:(假装不是一个大学生课设)在现代教育管理中,学生管理系统显得尤为重要。这种系统能够帮助教育机构有效地管理学生资料、成绩、出勤以及其他教育相关活动,从而提高管理效率并减少人为错误。通过使用Python&#xf…

IDEA版本推荐

推荐版本: IDEA 2024.1.4 下载链接:IDEA下载 (下载时可以往下拖,选到自己想要的版本哦) 本人由于项目开发需要,陆续用过几个版本的IDEA,包括: IDEA 2020.2.4 。这是在看韩顺平老师…

昇思25天学习打卡营第9天|CycleGAN图像风格迁移互换

文章目录 昇思MindSpore应用实践基于MindSpore的CycleGAN图像风格迁移互换1、CycleGAN 概述2、生成器部分3、判别器部分4、优化器和损失函数5、模型训练6、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 基于MindSpore的C…

打造商贸物流“产-供-销”、“仓-运-配”全流程供应链

在当今全球化的商业环境中,商贸物流平台的搭建成为企业提升效率、降低成本并增强市场竞争力的关键因素。在现代商业环境中,商贸与物流之间的紧密协作是业务成功的关键因素。然而,许多组织面临着信息不对称、资源配套不足、以及系统间隔离等痛…

Windows的管理工具

任务计划程序:这是一个用来安排任务自动运行的工具。你可以在这里创建新的任务,设定触发条件,并指定任务的操作。 事件查看器:这是一套日志记录和分析工具,,你可以了解到系统的工作状况,帮助诊…

Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享

本书从一个系统化的视角,秉承大道至简的主导思想,介绍Spark中最值得关注的内 容,讲解Spark部署、开发实战,并结合Spark的运行机制及拓展,帮读者开启Spark技术之旅。 Spark大数据处理:技术、应用与性能优化…

阿里云邮件推送邮件发送失败的问题排查解决

阿里云邮件推送为何失败?解决邮件推送失败的步骤指南! 即便是功能强大的阿里云邮件推送服务,也可能在实际使用中遇到邮件发送失败的问题。AokSend将详细介绍如何排查和解决阿里云邮件推送邮件发送失败的问题。 阿里云邮件推送:验…

深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手

我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机、甚至整个城市。现在,想象一下如果有一个数字世界的乐高,我们可以用这样的“积木”来构建智能程序,这些程序能够阅读、理解和撰写文本&#xf…

6.26.3 基于Transformer的深度神经网络在数字乳腺断层合成图像上的乳腺癌分类

开发一种有效的深度神经网络模型,该模型结合了相邻图像部分的上下文,以检测数字乳腺断层合成(DBT)图像上的乳腺癌。 数字乳房断层合成(DBT)是一种医学成像技术,其中检测器围绕患者以有限角度旋转并记录多幅图像。然后将这些图像重建为二维(2D…

盛元广通打造智慧校园实验室安全管理系统

盛元广通智慧校园实验室安全管理系统以安全为重点,构建由学校、二级单位、实验室组成的三级联动的实验室安全多级管理体系、多类用户角色,内置教育部标准检查表,支撑实验室相关业务过程的智慧管理。实现通过PC端/手机移动端开展检查工作、手机…

一个opencv实现检测程序

引言 图像处理是计算机视觉中的一个重要领域,它在许多应用中扮演着关键角色,如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一,它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…

Vue86-Vuex中的getters属性

一、getters的使用 1-1、index.js中getters的书写 计算属性computed靠return获得返回值! 1-2、组件中getters的调用 state是数据源,getters是拿着数据源里的东西进行一番加工。像极了:data和computed 二、小结

Map Set(Java篇详解)

🍁 个人主页:爱编程的Tom💫 本篇博文收录专栏:Java专栏👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ 等 🎉 欢迎 👍点赞✍评论⭐收藏💖三连支持…

设备的智能决策AI大模型与ESP32-S3芯片应用,启明云端乐鑫代理商

在数字化浪潮的推动下,智能家居、智能安防、智能设备等领域对AI技术的需求日益增长,人工智能(AI)正迅速成为推动各行各业创新的核心力量。 AI大模型技术以其强大的数据处理能力和深度学习能力,正在成为智能时代的新动…

图书电商引入实在Agent:自动化运营提效80%,节省人天1000+

某知名教辅图书品牌深耕中小学教辅图书领域,是中国最具影响力的教育出版策划与发行集团之一,以丰富的图书品类,满足了小学、初中、高中各年龄段读者多元化的阅读需求。 2023年,该品牌在运营、客服等多部门超60个场景中部署实在Ag…

维护el-table列,循环生成el-table

1、lib/setting.js(维护table列) const columns[{ label: 类型, prop: energyName, width: 150, isText: true },{ label: 消耗量(t或10⁴m), prop: inputNum, isInput: true },{label: CO₂,children: [// { label: 核算因子, prop: co2FactorValue, w…

IC烧录员-带着工程师的梦想远航!

如果说软件工程师是代码程序的创造者,那么IC烧录员就是把工程师们辛苦敲代码,日夜辛劳的成果烧录到芯片里面的实践者,是他们,让工程师们的梦想运用到实践中,是他们带着工程师的梦想远航,他们的薪酬或许没有…

SprongBoot3整合Knife4j实现在线接口文档

大家好,我是晓凡。 写在前面 在上一篇文章,我们详细介绍了SpringBoot3 怎么整合SpringDoc实现在线接口文档。但是,有不少小伙伴 都觉得接口界面太丑了。有没有什么更美观一点的UI界面呢? 当然是有的了,毕竟这是一个…