ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PostgreSQL 用 daterange 构造日期范围:边界语义、实战查询与相关技巧(til 仓库实战笔记)

PostgreSQL 用 daterange 构造日期范围:边界语义、实战查询与相关技巧(til 仓库实战笔记) 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本文围绕 til 仓库中 构造日期范围笔记 的核心知识点展开PostgreSQL 内置的daterange范围类型与daterange()构造函数的用法、边界开闭语义[含下界、)排上界并补充结合generate_series、BETWEEN SYMMETRIC等仓库内相关笔记的实战写法与范围操作符知识帮助你直接在 psql 或业务 SQL 中构造、查询日期区间。一分钟上手daterange() 构造日期范围PostgreSQL 原生提供多种范围类型Range Types其中专用于日期的就是daterange。最直接的构造方式是调用daterange()函数传入两个字符串分别表示日期区间的下界lower bound和上界upper boundselect daterange(2015-1-1,2015-1-5); daterange ------------------------- [2015-01-01,2015-01-05)这就是原笔记中的核心示例。两个参数会被自动转换为date类型因此2015-1-1这种省略前导零的写法也能正常解析输出时统一规范化为[2015-01-01,2015-01-05)。注意这里把结果打印出来并不是真的产生了字符串而是 psql 对该daterange值调用了默认的输出表示括号与逗号正是范围类型的标准文本形态。理解边界语义[与)daterange的输出[2015-01-01,2015-01-05)可以直观地读出边界规则下界用[表示含义是包含inclusive该边界日期即2015-01-01属于该范围上界用)表示含义是排除exclusive该边界日期即2015-01-05不属于该范围。因此上面的范围实际覆盖的是2015-01-01、2015-01-02、2015-01-03、2015-01-04这 4 天。这种左闭右开的语义与编程中[start, end)的区间约定一致非常契合结束时间不包含当天这类业务习惯例如统计某月数据时结束日期取下月 1 号。四种边界组合范围类型的边界不一定是左闭右开构造函数允许为每个边界显式指定开闭写法含义示例输出[a,b)下界含、上界排默认[2015-01-01,2015-01-05)(a,b]下界排、上界含(2015-01-01,2015-01-05][a,b]两边都含[2015-01-01,2015-01-05](a,b)两边都排(2015-01-01,2015-01-05)在调用函数构造时可以传入表示开闭的字符作为额外参数例如daterange(2015-1-1, 2015-1-5, [])得到[2015-01-01,2015-01-05]。此外范围还支持无界边界例如daterange(2015-1-1, NULL)表示从 2015-01-01 起到无穷大输出类似[2015-01-01,)对边界使用(,]等标记时对应的排他无界写法也合法。需要精确判断某天是否落在区间内时边界语义直接决定包含操作符的判定结果务必先确认开闭。daterange 的孪生兄弟其他内建范围类型daterange只是 PostgreSQL 众多内建范围类型之一理解它之后其余类型完全可以举一反三int4range/int8range整数范围numrange数值numeric范围tsrange/tstzrangetimestamp/timestamptz时间戳范围daterangedate日期范围。它们的构造函数签名一致例如select int4range(1, 10); -- [1,10) select numrange(0.5, 2.5, []); -- [0.5,2.5] select tsrange(2015-01-01 00:00:00, 2015-01-02 00:00:00); -- [2015-01-01 00:00:00,2015-01-02 00:00:00)只要掌握了daterange的参数顺序与边界字符约定其他类型只是换了数据类型而已。实战与 generate_series 配合生成日期序列仓库中另有 生成数字序列笔记 讲解了generate_series的用法给start、stop两个参数即可生成序列默认步长为 1也可以传入第三步长参数实现倒序或跳跃如generate_series(5,1,-1)、generate_series(3,17,3)。该笔记特别留了一个练习——用时间戳尝试。这两篇笔记正好可以组合成常见的生成一段日期列表场景select generate_series(2015-01-01::date, 2015-01-05::date, interval 1 day);结果会得到从 2015-01-01 到 2015-01-05 每一天。而如果希望把起止日期收敛成一个可整体参与运算的区间则正是daterange(2015-1-1, 2015-1-5)的用途——前者产出逐日的行后者产出单一范围值两者互为补充按需选用。对比用 BETWEEN SYMMETRIC 替代范围判断仓库中的 Between Symmetric 笔记 提供了一个与范围语义密切相关的过滤手段。普通between a and b要求左值小于右值否则会得到空集select * from generate_series(1,10) as numbers(a) where numbers.a between 6 and 3; -- 空结果而between symmetric会自动交换两个边界保证总是得到一个非空区间select * from generate_series(1,10) as numbers(a) where numbers.a between symmetric 6 and 3; -- 3,4,5,6因此如果只是某列是否落在两个日期之间这种判断且不关心边界开闭细节between symmetric是比构造daterange更轻量的写法而当你需要把范围作为一列存储、建索引、或参与范围运算时daterange才是正解。两者定位不同可以并存。更进一步范围操作符与索引daterange的真正价值在于它是一等公民的数据类型可以存储在列里并配合一组专用操作符使用。仓库中 展示操作符版本笔记 展示了用\do 查看操作符定义的方法其中可以看到anyrange anyrange、anyrange anyelement等签名——这印证了范围类型支持包含判断select daterange(2015-1-1, 2015-1-5) date 2015-01-03; -- true select daterange(2015-1-1, 2015-1-5) daterange(2015-1-3, 2015-1-7); -- 两个区间有重叠在daterange列上还可以创建 GiST 索引来加速这类查询create index on bookings using gist (stay_period);这样找出所有与某区间重叠的预订这类业务酒店订房、排期冲突检测就可以高效落地。需要说明的是包含、重叠、-|-相邻等范围操作符与 GiST 索引能力属于 PostgreSQL 范围类型的标准特性本仓库内的笔记仅覆盖了daterange构造与操作符列举实际操作符的具体返回可结合仓库示例在自己环境中验证。小结围绕 til 仓库 构造日期范围笔记可以提炼出一条完整的学习路径构造daterange(2015-1-1, 2015-1-5)用两个日期字符串快速得到范围值语义[含下界、)排上界并清楚四种开闭组合与无界边界的写法泛化同样的构造函数适用于int4range、numrange、tsrange等其他内建范围类型联动与 generate_series、BETWEEN SYMMETRIC 按场景选用进阶结合、等操作符可参考 show-all-versions-of-an-operator与 GiST 索引把范围类型用进真实业务。掌握了daterange的构造与边界语义日期区间相关查询就从字符串拼接 between 判断升级为类型安全的原生范围运算。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐til 仓库笔记精讲PostgreSQL 复合索引Composite Index创建与查询优化实战til 仓库笔记精讲PostgreSQL 复合索引Composite Index创建与查询优化实战 本篇技术指南围绕 til 仓库中 PostgreSQL文档教程知识库在 PostgreSQL 中统计某列单词数量regexp_split_to_array 组合查询实战til 仓库笔记详解在 PostgreSQL 中统计某列单词数量regexp_split_to_array 组合查询实战til 仓库笔记详解 本篇技术指南围绕 til 仓库文档教程知识库用 git log 精确查询文件加入仓库的日期TIL Git 实战用 git log 精确查询文件加入仓库的日期TIL Git 实战 本篇技术指南围绕 til 仓库中 find the date that a file w文档教程知识库上一篇GetQzonehistory 批量导出 QQ 空间历史说说的完整指南下一篇终极OpenDrop性能测试不同CPU架构下AirDrop传输速度对比指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表