【PGCCC】在 Postgres 中创建日期箱的 4 种方法:interval、date_trunc、extract 和 to_char

在这篇文章中,我将介绍一些按日期查询数据的关键函数。有关在 Postgres 中存储日期和时间的最佳方法的摘要

interval——日期操纵的瑞士军刀

是interval用于修改其他时间的数据类型。例如,可以从已知时间中添加或减去间隔。间隔非常方便,是您按日期快速汇总数据的第一个方法。就像瑞士军刀一样,它并不总是完成工作的最佳工具,但它可以在紧急情况下使用。让我们谈谈它的优势所在。

我们如何运行查询来返回过去 90 天的订单总额?当然可以使用间隔。如果没有间隔,我们经常看到人们使用从生成日期的外部源传递的日期变量。使用now() - INTERVAL ‘90 days’,无论日期如何,您都可以使用相同的查询。另一个秘诀是使用now()服务器上当前时间的时间戳。

SELECTSUM(total_amount)
FROMorders
WHEREorder_date >= NOW () - INTERVAL '90 days';
    sum
-----------259472.99
(1 row)

除了使用 之外now(),current_date还可以用来返回日期而不是时间。

SELECTSUM(total_amount)
FROMorders
WHEREorder_date >= current_date - INTERVAL '90 days';

这两个查询不同——current_date从一天的开始开始,并now()包含全天的时间。使用时,now()结果将仅匹配当前时间 90 天后发生的结果。

通常,人们使用更短的形式来表示间隔,但这是相同的查询:

SELECTSUM(total_amount)
FROMorders
WHEREorder_date >= NOW() - '90 days'::interval;

使用间隔进行分箱

要创建间隔范围,我们可以结合使用CASE和interval。 SQLCASE在查询中执行条件逻辑。 的格式为CASE,WHEN … THEN下面是执行示例 case 语句的查询:

SELECTCASEWHEN false THEN 'not this'WHEN true THEN 'this will show'ELSE 'never makes it here'END;

现在,让我们将订单按时间范围分类:“30-60 天前”、“60-90 天前”

SELECTCASEWHEN order_date BETWEEN (NOW() - INTERVAL '60 days') AND (NOW() - INTERVAL '30 days')THEN '30-60 days ago'WHEN order_date BETWEEN (NOW() - INTERVAL '90 days') AND (NOW() - INTERVAL '60 days')THEN '60-90 days ago'END AS date_range,COUNT(*) AS total_orders,SUM(total_amount) AS total_sales
FROMorders
WHEREorder_date BETWEEN (NOW() - INTERVAL '90 days') AND (NOW() - INTERVAL '30 days')
GROUP BYdate_range
ORDER BYdate_range;
   date_range   | total_orders | total_sales
----------------+--------------+-------------30-60 days ago |          160 |   101754.2060-90 days ago |          128 |    88086.24

这可能看起来有点复杂,但该语句的条件是order_date BETWEEN begining_date_value AND ending_date_value。由于CASE语句在第一个真值条件后结束,我们可以进一步简化它:

SELECTCASEWHEN order_date >= NOW() - '30 days'::interval THEN '00-30 days ago'WHEN order_date >= NOW() - '60 days'::interval THEN '30-60 days ago'ELSE'60-90 days ago'END AS date_range,COUNT(*) AS total_orders,SUM(total_amount) AS total_sales
FROMorders
WHEREorder_date >= NOW() - '90 days'::interval
GROUP BYdate_range
ORDER BYdate_range;

最好根据 SQL 查询的明确程度来选择模式。使用BETWEEN更明确,可能最适合选择更明确查询的团队。使用困难的部分INTERVAL是最近时间大于较早时间 — 因此,这>=可能会让那些没有使用过大量时间操作的人绞尽脑汁。

总结:用于interval对连续时间进行分箱。

date_trunc - 最简单的日期分箱函数

用于date_trunc对预定义时间进行分箱:如日、周、月、季度和年。间隔逻辑可能很复杂,而date_trunc非常简单。

乍一看,date_trunc的名称可能表明它与格式化有关,但与 结合使用时功能更强大GROUP BY。date_trunc是处理分析时查询工具包的重要组成部分。date_trunc 的简单用法如下:

/* show the beginning of the first day of the month */
SELECT date_trunc('month', current_date);/* show the beginning of the first day of the week */
SELECT date_trunc('week', current_date);/* show the beginning of the first day of the year */
SELECT date_trunc('year', current_date);/* show the beginning of the first day of the current quarter */
SELECT date_trunc('quarter', current_date);

要生成日期箱,请从记录的日期中提取时间段。例如,让我们编写一个查询来显示每月的订单数量和订单总销售额:

SELECTdate_trunc ('month', order_date) AS month,COUNT(*) AS total_orders,SUM(total_amount) AS monthly_total
FROMorders
GROUP BY 1
ORDER BYmonth;

结果如下:

        month        | total_orders | monthly_total
---------------------+--------------+---------------2024-08-01 00:00:00 |           11 |       2699.822024-09-01 00:00:00 |           39 |       8439.41
(2 rows)

使用GROUP BY,Postgres 根据函数返回的唯一值进行计数和求和date_trunc。可用的箱为date_trunc:千年、世纪、十年、年、季度、周、日、小时、分钟、秒、毫秒。

Extract-有时你必须做一些有趣的事情

并非所有日期都能很好地分为日、月、年等。该extract函数提取日期/时间类型的特定值。例如,我通常将extract用于以下情况:

/* returns the epoch value for a date / time    */
/* I this use to send date values to Javascript */
SELECT extract('epoch' from current_date);/* returns the hour from a time type */
SELECT extract('hour' from now());

如何将其用于对值进行分类?例如,如果您想查找一周中哪一天的哪个小时的订单数量和销售额最高:

SELECTextract('dow' from order_date) AS day_of_week,extract('hour' from order_date) AS hour,COUNT(*) AS total_orders,SUM(total_amount) AS monthly_total
FROMorders
GROUP BY 1, 2
ORDER BY 1, 2;
 day_of_week | hour | total_orders | monthly_total
-------------+------+--------------+---------------0 |   23 |           35 |      23631.561 |    0 |           31 |      19299.88

您会在这里看到星期日是“0”而星期六是“6”。

其中date_trunc保留较高上下文,extract删除除请求的上下文之外的所有上下文。

to_char - 极端改造日期版

它很尴尬,因为to_char它既是日期分箱中最通用的函数,也是最令人讨厌的函数。该函数将接受时间/日期、文本或数字以进行额外的格式化,因此它不是明确用于日期函数的。它从未失败过,当我使用 to_char 时,有人告诉我我可以使用更好的函数。它可以快速生成人类可读的值,但它不适合发送数据进行额外的机器处理。

以下列举几个例子to_char:

/* extract current day of week and current hour of day based on UTC */
SELECT to_char(now(), 'DayHH24');/* extract current day of week and current hour of day based on NYC time zone */
SELECT to_char(now() AT TIME ZONE 'America/New_York' , 'DayHH24');

这将输出当前星期几以及基于 UTC 时间的当前小时。这让你伤透了脑筋吧?“DayHH24”部分是什么意思?Postgres 文档列出了to_char 使用的保留字符串的长列表:

要更改月份的显示方式,请使用 to_char 提取并格式化名称和年份:

SELECT to_char(order_date, 'FMMonth YYYY') AS formatted_month,COUNT(*) AS total_orders,SUM(total_amount) AS monthly_total
FROMorders
GROUP BY 1
ORDER BY 1;
 formatted_month | total_orders | monthly_total
-----------------+--------------+---------------August 2024     |           11 |       2699.82September 2024  |           39 |       8439.41

转义保留字符串to_char:

财务中季度的常见格式是“Q1”/“Q2”/“Q3”和“Q4”。使用to_char,我们可以以该格式提取某个时间的季度。但是,“Q”是季度的保留关键字。要打印“Q”而不对其进行评估,请将其括在双引号中:

SELECTto_char(order_date, '"Q"Q-YYYY') AS formatted_quarter,SUM(total_amount) AS total_amount
FROMorders
GROUP BY 1
ORDER BY 1;
 formatted_quarter | total_amount
-------------------+--------------Q1-2022           |    313872.84Q1-2023           |    282774.15Q1-2024           |    287379.33

概括

分箱是财务报告和数据分析中对数据进行分面处理的重要工具。日期和时间是一种比乍一看更复杂的信息——小时、月、小时、季度、年。因此,一个日期可以以多种方式进行分面处理。

幸运的是,Postgres 具有处理日期所需的函数。简要总结如下:

interval- 通过添加/减去修改日期/时间

date_trunc -截断日期/时间 — 本质上是向下舍入到最接近的值

extract- 从日期/时间(日、周、月、季度、年)中提取单条信息

to_char - 将输出格式化为特定样式的日期格式或文本字符串。

作者:Christopher Winslett
链接:https://www.crunchydata.com/blog/4-ways-to-create-date-bins-in-postgres-interval-date_trunc-extract-and-to_char
#PG证书#PG考试#postgresql培训#postgresql考试#postgresql认证

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

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

相关文章

自研小程序-心情追忆

在近期从繁忙的工作中暂时抽身之后,我决定利用这段宝贵的时间来保持我的Java技能不致生疏,并通过一个个人项目来探索人工智能的魅力。 我在Hugging Face(国内镜像站点:HF-Mirror)上发现了一个关于情感分析的练习项目&…

【设计模式】策略模式定义及其实现代码示例

文章目录 一、策略模式1.1 策略模式的定义1.2 策略模式的参与者1.3 策略模式的优点1.4 策略模式的缺点1.5 策略模式的使用场景 二、策略模式简单实现2.1 案例描述2.2 实现代码 三、策略模式的代码优化3.1 优化思路3.2 抽象策略接口3.3 上下文3.4 具体策略实现类3.5 测试 参考资…

【React】初学React

A. react中如何创建元素呢? 说明一点: 属性都改为驼峰形式(无障碍属性aria-*除外), class改成className 创建元素 B. 变量或表达式如何表示呢?大括号{ }包起来 变量值用大括号包裹 C. 元素和组件的区别 元素…

伦敦金价格是交易所公布的吗?

今年以来,伦敦金价格波动可谓是波澜壮阔,盘中屡次刷新历史新高,目前已经冲上了2700的历史大关。面对高歌猛进的伦敦金价格,投资者除了进行交易之外,还有一点相关方面的知识是想了解的。例如,伦敦金价格是交…

程序员也要认识下“信创产业”

兄弟姐妹们,大家初入社会会觉得技术是第一位,我呸,其实你在那个领域敲代码的选择才是最重要的,选对了领域绝对比你背上100个面试题目强,今天带大家了解下信创产业。 信创产业,即信息技术应用创新产业&#…

钉钉向广告低头

商业化重压下,钉钉试水应用内广告。 作者|文昌龙 编辑|杨舟 “钉钉吃相真心难看!早晨打卡时间还做开屏广告赚打工人的钱,比如很多踩点上班的,就因为你这5秒时间的开屏广告,没按上打卡按钮就会迟到,知道吗…

IDC报告解读:实用型靶场将成为下一代网络靶场的必然方向

——赛宁网安:回归用户需求,开创实用型靶场新范式 导读 本文基于《IDC TechScape:中国网络安全软件技术发展路线图,2024》中关于网络安全实训演练测试平台(靶场)的技术路线分析,结合国内外靶场…

RESTful风格

目录 一、什么是RESTful 1.1 RESTFul对WEB服务接口的规定包括: 1.2 REST对请求方式的具体约束如下: 1.3 REST对URL的具体约束如下: 1.4 RESTFul的核心概念: 二、RESTful风格与传统方式对比 三、RESTful风格演示 3.1 查询所…

openapi回调地址请求不通过

目录 1. 验证url接口get请求本地自测报错 2. 测试回调模式成功不返回结果 3. 测试回调模式返回结果带双引号 对接企业微信 产生会话回调事件 接口问题解决 1. 验证url接口get请求本地自测报错 java.lang.IllegalArgumentException: Last encoded character (before the pa…

砥砺十年风雨路,向新而行创新程丨怿星科技十周年庆典回顾

10月24日,是一年中的第256天,也是程序员节,同时也是怿星的生日。2014年到2024年,年华似水匆匆一瞥,多少岁月轻描淡写,怿星人欢聚一堂,共同为怿星科技的十周年庆生! 01.回忆往昔&…

C++:AVL树

目录 AVL树概念 AVL树的实现 AVL树的节点 AVL树的插入 AVL树的平衡调整 右单旋 左单旋 左右双旋 右左双旋 完整的插入函数 AVL树的查找 AVL树的验证 验证有序 验证平衡 完整代码 AVL树概念 AVL树是一种具有特殊性质的二叉搜索树,AVL树的左右子树也都…

Nginx线程模型

Nginx的线程模型具有其独特的设计特点,主要基于多进程和异步非阻塞的处理机制。以下是对Nginx线程模型的详细解析: 一、多进程模型 Nginx采用的是多进程模型,而非多线程模型。在这种模型中,Nginx会启动一个master进程和多个work…

【HTML】——VSCode 基本使用入门和常见操作

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 零:HTML开发工具VSCode的使用 1:创建项目 2:创建格式模板&#x…

【C/C++】【三种方法】模拟实现strlen

学习目标: 使用代码模拟实现strlen。 逻辑: strlen 需要输入一个字符串数组类型的变量,并且返回一个整型类型的数据。strlen 需要计算字符串数组有多少个元素。 代码1:使用计数器 #define _CRT_SECURE_NO_WARNINGS 1 #include&…

【双指针】【数之和】 LeetCode 633.平方数之和

算法思想&#xff1a; 双指针枚举i,j&#xff1b;类似三数之和 class Solution { public:bool judgeSquareSum(int c) {long long sum0;vector<int> dp;dp.push_back(0);long long start1;while(sum < c){sum start *start;if(sum>c) break;else dp.push_back(…

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…

解决方案 | 部署更快,自动化程度高!TOSUN同星线控底盘解决方案

Tosun——线控底盘解决方案 在汽车智能化和电动化进程中&#xff0c;智能线控底盘相关的核心技术和产品成为了新能源汽车及智能驾驶产业的重点发展方向。同星智能作为行业先行者&#xff0c;精研汽车电子行业整体解决方案&#xff0c;提供基于TSMaster的底盘HIL仿真测试解决方…

分布式光伏管理办法

随着分布式光伏项目的不断增加&#xff0c;传统的管理方式已经难以满足高效、精准的管理需求。光伏业务管理系统作为一种集信息化、智能化于一体的管理工具&#xff0c;正在逐步成为分布式光伏项目管理的重要支撑。 光伏业务管理系统通过数字化手段实现对光伏业务全流程的精细化…

细腻的链接:C++ list 之美的解读

细腻的链接&#xff1a;C list 之美的解读 前言&#xff1a; 小编在前几日刚写过关于vector容器的内容&#xff0c;现在小编list容器也学了一大部分了&#xff0c;小编先提前说一下学这部分的感悟&#xff0c;这个部分是我学C以来第一次感到有难度的地方&#xff0c;特别是在…

文件操作案例

文件操作&#xff08;帮助小学生控诉妈妈&#xff09;:###无任何不良指导###