📫 作者簡介:「六月暴雪飛梨花」,專注于研究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
函數是一個非常強大且靈活的工具,它可以在多種應用場景中生成連續的序列。
- 生成整數序列:上文已經講述。
- 生成時間序列:本篇重點講述。
- 生成IP地址序列:雖然generate_series函數本身不直接支持IP地址的生成,但可以通過一些技巧(如將IP地址轉換為整數進行計算后再轉換回IP地址)來間接實現。
- 模擬測試數據:在應用功能數據庫開發或測試階段,經常需要生成大量的測試數據。generate_series可以方便地生成連續的整數或時間序列,用于填充測試表。
- 批量更新或處理數據:generate_series可以與UPDATE、DELETE等語句結合使用,實現復雜的批量操作。
- 報表和數據分析: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。
總結
遇事不要慌,多看看官網,多找找原因,實在不行多翻一翻其他的博文,總有能幫助你的那一刻。下一篇總結下其他參數的使用方法。
[引用]
- PostgreSQL 16(generate_series):https://www.postgresql.org/docs/16/functions-srf.html
- PostgreSQL 12(generate_series):https://www.postgresql.org/docs/12/functions-srf.html
歡迎關注博主 「六月暴雪飛梨花」 或加入【六月暴雪飛梨花社區】一起學習和分享Linux、C、C++、Python、Matlab,機器人運動控制、多機器人協作,智能優化算法,濾波估計、多傳感器信息融合,機器學習,人工智能等相關領域的知識和技術。