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

news2024/11/25 20:49:30

📫 作者简介:「六月暴雪飞梨花」,专注于研究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,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。

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

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

相关文章

【Whisper】WhisperX: Time-Accurate Speech Transcription of Long-Form Audio

Abstract Whisper 的跨语言语音识别取得了很好的结果,但是对应的时间戳往往不准确,而且单词级别的时间戳也不能做到开箱即用(out-of-the-box). 此外,他们在处理长音频时通过缓冲转录

c++类模板--无法解析的外部符号

解决办法 文章目录 解决办法方法1(推荐).在主函数包含头文件时将实现模板类的函数也包含进来方法2.将模板类的实现方法写在头文件里面方法3.函数模板声明前加inline 可能错误2,类内实现友元输出重载 方法1(推荐).在主函数包含头文件时将实现模板类的函数也包含进来 …

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。(素数只能被1或其本身整除的数) 2. 一个函数判断一年是不是闰年。 3.写一个函数,实现一个整形有序数组的二分查找。 4. 写一个函数,每调用一次这个函数,使得num每次增…

养老院人员定位系统如何实现

养老院人员定位系统应反应养老公寓情况、增加老人安全防范级别、加强安全保障措施,部署物联网设备及配套集成平台软件,实时定位人员信息及时反应老人救助行为,实现与视频、门禁一卡通等自动化监管设施联合动作,提高应急响应速度和…

【vite创建项目】

搭建vue3tsvitepinia框架 一、安装vite并创建项目1、用vite构建项目2、配置vite3、找不到模块 “path“ 或其相对应的类型声明。 二、安装element-plus1、安装element-plus2、引入框架 三、安装sass sass-loader1、安装sass 四、安装vue-router-next 路由1、安装vue-router42搭…

Mybatis入门の基础操作

1 Mybatis概述 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的…

vue3+vue-router+vite 实现动态路由

文章中出现的代码是演示版本,仅供参考,实际的业务需求会更加复杂 什么是动态路由 什么场景会用到动态路由 举一个最常见的例子,比如说我们要开发一个后台管理系统,一般来说后台管理系统都会分角色登录,这个时候也就涉…

幻兽帕鲁卡顿严重、延迟高怎么办?幻兽帕鲁卡顿问题处理

幻兽帕鲁更是一款支持多人游戏模式的生存制作游戏。玩家们可以邀请好友一同加入这个充满奇幻与冒险的世界,共同挑战强大的敌人,分享胜利的喜悦。在多人模式中,玩家之间的合作与竞争将成为游戏的一大看点。玩家们需要充分发挥自己的智慧和策略…

centos7的yum命令无法使用解决方案

文章目录 问题排查流程解决方案总结 问题 今天新建了个centos7的虚拟机发现yum无法正常使用 已加载插件:fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infra…

单片机学习(14)--DS18B20温度传感器

DS18B20温度传感器 13.1DS18B20温度传感器基础知识1.DS18B20介绍2.引脚及应用电路3.内部结构框图4.存储器框图5.单总线介绍6.单总线电路规范7.单总线时序结构8.DS18B20操作流程9.DS18B20数据帧 13.2DS18B20温度读取和温度报警器代码1.DS18B20温度读取(1)…

linux模拟aix盘19c单机asm安装补丁

linux模拟盘aix盘vi /etc/rc.d/rc.local/bin/ln /dev/sda /dev/rhdisk2/bin/ln /dev/sdb /dev/rhdisk3 /bin/chown grid:oinstall /dev/rhdisk*chmod 660 /dev/rhdisk* 一、19c安装GI(Standalone Oracle Restart) su - grid配置环境变量vi .profileex…

【Linux】Linux用户,用户组,其他人

1.文件拥有者 初次接触Linux的朋友大概会觉得很怪异,怎么“Linux有这么多用户,还分什么用户组,有什用呢?”,这个“用户与用户组”的功能可是相当健全而且好用的一个安全防护措施。 怎么说呢?由于Linux是个…

人生感悟 | 努力奋斗和内卷不是一个意思。

哈喽,你好啊,我是雷工! 有个很有趣的话题,是不是努力奋斗导致的内卷? 如果每个人都躺平,各行各业的内卷是不是就不存在了? 01 有关联不尽同 两者有关量,但无绝对的导向关系。 努力…

vue高德地图使用

先根据官方方法给vue项目引入高德 高德文档地址 做好准备后使用 初始化地图 AMap.plugin(AMap.MoveAnimation, () >{//地图this.map new AMap.Map("mapContainer", {resizeEnable: true,center: [116.397447,39.909176],//地图中心坐标zoom:12,//缩放值});this.…

掌握亚马逊自养号:测评策略的核心要点与实战经验

在当今电商领域的激烈角逐中,亚马逊测评对于卖家而言,已从单纯的销量助推器与好评累积工具,进化为品牌塑造与市场洞察的关键环节。然而,许多卖家仍局限于传统认知,未能充分挖掘自养号测评的多元化价值与深远影响。本文…

深入Kafka:如何保证数据一致性与可靠性?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello, 大家好!我是小米,今天我们来聊一聊Kafka的一致性问题。Kafka作为一个高性能的分布式流处理平台,一直以来都备受关注。今天,我将深入探讨Kaf…

智算中心风云再起,如何锚定突围之路?

导读:2024年,智算中心建设全面提速,头部玩家争相布局。如何打造智算中心的差异化竞争能力? 2024年,随着大模型和生成式AI应用加速落地,各行各业对AI算力的需求持续暴涨。作为AI时代的算力基础设施&#xff…

Spring AI 1.0.0 新变化,从 0.8.1 如何升级

Spring AI 1.0.0-M1 版本已经发布,距离 1.0.0 正式版又更近了一步。同时这也意味着,Spring AI 1.0.0 的 API 已经基本确定,不会发生大的改动。这里介绍一下,相对于上一个发布版本 0.8.1,Spring AI 1.0.0 的一些重要的变…

【pearcmd】通过pearcmd.php 进行GetShell

https://cloud.tencent.com/developer/article/2204400 关于PHP 配置 register_argc_argv 小结 的一些研究文章。 应用例题 [NewStarCTF 2023 公开赛道]Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|l…

国外惊现IDM命令行永久破解方法

IDM 想必大部分人都知道和使用过&#xff0c;这是一款在国内外都非常流行的下载神器&#xff0c;除了不能支持种子文件和磁力之外&#xff0c;完爆国内的迅雷&#xff0c;小编我在 6 年前就已经购买了永久更新正版。 image.png 不过最近国外有大神流传出了一个号称可以永久完美…