用 PostgreSQL age() 函数计算年龄与任意两个时间点之间的时间跨度

发布时间:2026/10/8 11:24:58

用 PostgreSQL age() 函数计算年龄与任意两个时间点之间的时间跨度 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载在 PostgreSQL 中age()函数是计算时间跨度的利器传入单个时间戳即可得到从该时刻到现在的年龄如自 Y2K 以来过去了多久传入两个时间戳则可求出任意两点之间以年、月、天为单位的时间差如某个人的寿命。本文以 postgres/determining-the-age-of-things.md 为主线结合本仓库中关于 interval、timestamp 转换与时序函数的多篇 TIL完整讲解age()的两种调用形式、返回值语义、输入构造方式与实战场景。age() 返回的是什么符号化的 intervalage()函数的返回值类型是 PostgreSQL 的interval。但它的特殊之处在于普通的时间减法如timestamp1 - timestamp2通常只以天 小数秒的形式给出结果而age()会输出一种**符号化symbolic**的 interval——即把时间差拆解为X years Y mons Z days这种更接近人类阅读习惯的表示这也正是本仓库 postgres/determining-the-age-of-things.md 示例中输出16 years 4 mons 12 days的原因。关于interval数据类型的更多定义方式可参考本仓库 postgres/different-ways-to-define-an-interval.md既可以用interval 3 days关键字加字符串也可以3 days::interval强转还可以通过make_interval(days 3)函数构造。理解interval的表示能力是正确解读age()返回结果的前提。单参数形式age(timestamp) 计算距今时长age()最常用的是单参数形式——传入一个时间戳返回从该时刻到当前时间的跨度。原文档中给出的示例是计算自 Y2K2000 年 1 月 1 日以来已经过去了多久 select age(timestamp 2000-01-01); age ------------------------- 16 years 4 mons 12 days这里timestamp 2000-01-01是 PostgreSQL 的标准时间戳字面量写法类型关键字 字符串常量。age()会以当前日期为基准做减法输出结果是符号化的 interval。在实际查询中当前时间也可以显式指定例如配合本仓库 postgres/timestamp-functions.md 中介绍的now()等价于transaction_timestamp()表示当前事务开始时刻来对比验证-- 结果随当前时刻变化例如 select age(now() - interval 3 days); age ------------------ 3 days需要注意age(timestamp)的单参数形式是按日历方式计算整年整月整天的差值而不是按固定的 24 小时一天来换算这正是它适合表达年龄这类概念的原因。双参数形式age(timestamp1, timestamp2) 计算两个时间点之差当我们需要计算任意两个时间点之间的跨度时使用双参数形式age(timestamp1, timestamp2)返回timestamp1减去timestamp2的结果输出为X years Y mons Z days的形式。原文档以美国歌手 Prince 为例——传入死亡日期和出生日期计算其享年 select age(timestamp April 21, 2016, timestamp June 7, 1958); age -------------------------- 57 years 10 mons 14 days这里两个时间戳都使用了自然语言风格的字符串字面量April 21, 2016PostgreSQL 的字符串解析器能够识别这种表达并自动转换为 timestamp 类型。输出57 years 10 mons 14 days即为其实际寿命。参数顺序与符号含义双参数形式的语义是第一个参数减去第二个参数因此age(2016-04-21, 1958-06-07)得到正值后面的时间在后若两个参数调换顺序结果会变成负数如-57 years -10 mons -14 days这与 PostgreSQL 中时间减法保持一致的符号约定参数既可以是timestamp类型也可以是date类型会按需转换只要保证两个参数的类型可以参与差值运算。输入时间戳的三种构造方式age()的两个参数本质上都需要解析为timestamp或可隐式转换的类型。除原文档展示的字符串字面量写法如timestamp 2000-01-01外还有以下几种常见构造方式。方式一ISO 8601 字符串直接强转本仓库 postgres/convert-a-string-to-a-timestamp.md 指出符合 ISO 8601 格式的字符串可以直接::timestamptz强转 select 2018-10-24::timestamptz; timestamptz ------------------------ 2018-10-24 00:00:00-05这种形式同样可以作为age()的参数 select age(2018-10-24::timestamptz);方式二to_timestamp() 按模板解析任意格式当字符串不是标准 ISO 格式时可以使用to_timestamp(text, format)按格式模板解析 select to_timestamp(2018-10-24, YYYY-MM-DD); to_timestamp ------------------------ 2018-10-24 00:00:00-05第一个参数是待转换的字符串第二个参数描述其格式。该方法对非标准输入如April 21, 2016这类英文日期也能通过Month DD, YYYY模板可靠解析。方式三从列数据直接传入实际业务中最常见的是直接传入表中存储的 timestamp/date 列例如计算用户年龄、合同剩余天数select name, age(birth_date) as current_age from users;此时age(birth_date)直接复用单参数形式以当前日期为基准得出每位用户的年龄配合WHERE条件即可筛选特定年龄段人群。实战场景age() 的典型用法场景一计算记录距今的时长结合本仓库 postgres/timestamp-functions.md 中介绍的时间函数可以灵活地表达距今多久-- 订单创建至今的时间跨度 select order_id, age(created_at) as age_of_order from orders order by created_at desc;场景二过滤指定时间跨度的记录利用age()的返回值与interval比较可以过滤出超过 X 时间的记录。例如找出注册超过 1 年的用户select * from users where age(created_at) interval 1 year;关于interval字面量的多种写法详见 postgres/different-ways-to-define-an-interval.md。场景三以年-月-天形式展示业务时长当需要向用户展示入职 X 年 Y 个月这类人类可读的时长时age()的符号化输出正好符合需求免去手动按天数换算年月的麻烦。注意事项与边界时间基准单参数age(timestamp)以当前日期本地时区为基准结果会随时间推移而变化若需要固定基准请使用双参数形式显式传入两个时间戳。返回值不是纯天数age()输出的是年/月/天符号化结构直接做天数级别的算术比较时建议先将其与interval常量比较或使用EXTRACT(EPOCH FROM interval)转成秒数。时区语义若使用带时区的timestamptz差值计算基于时间点本身若使用无时区的timestamp则按会话时区的日历语义计算。构造输入时建议明确使用带时区类型避免跨时区业务出现偏差参见 postgres/convert-a-string-to-a-timestamp.md 对timestamptz的说明。日期范围辅助当需要同时表达一个时间段而非单一跨度时可参考 postgres/constructing-a-range-of-dates.md 中的daterange()函数它与age()共同构成了 PostgreSQL 处理时间域的两类基本工具。小结age()是 PostgreSQL 中表达年龄和时间跨度最直观的函数age(timestamp)从当前日期算起返回符号化 intervalage(timestamp1, timestamp2)返回两时间点之差第一个减去第二个同样以年-月-天呈现输入支持字符串字面量、ISO 强转、to_timestamp()模板解析以及表列数据等多种来源返回结果可与interval常量比较实现按时间跨度过滤等常见需求。完整示例可继续阅读本仓库的 postgres/determining-the-age-of-things.md该文档也是本仓库 READMEREADME.mdPostgres 分类下列出的经典 TIL 条目。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐实测 Inpaint-web零安装的浏览器图像修复与在线图片超分辨率实测 Inpaint web零安装的浏览器图像修复与在线图片超分辨率 产品图上的供应商水印你还要再开一次 Photoshopinpaint web 是一款图像处理AI 应用前端StarRocks years_diff 函数详解计算两个日期/时间表达式之间的年份差StarRocks years_diff 函数详解计算两个日期/时间表达式之间的年份差 本篇技术指南围绕 StarRocks 的 years_diff 日期时数据库OLAP数据仓库大数据湖仓一体数据分析Bumbler入门教程3分钟学会追踪Rails项目初始化加载进度Bumbler入门教程3分钟学会追踪Rails项目初始化加载进度 Bumbler是一款专为Bundler项目设计的加载进度追踪工具能帮助开发者实时监控Rai开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/8 11:24:58

MOE强化学习中的训练-推理一致性问题ICEPOP

1. ICEPOP不是新模型,而是MOE强化学习里一个被忽视的“时差病”你有没有试过训练完一个MOE(Mixture of Experts)结构的强化学习智能体,结果在真实环境里一跑就崩?策略明明在训练时稳如老狗,推理时却像喝醉了…

2026/10/8 11:19:57

CLI 型 AI Agent 实战:从架构原理到工具调用与避坑指南

1. 从标题到落地:Agent-Reach 到底想解决什么问题第一次看到 Agent-Reach 这个名字,我下意识把它拆成了两半:Agent 和 Reach。Agent 是当下最热的 AI 智能体概念,Reach 是触达、延伸、够得着的意思。合在一起,我的理解…

2026/10/8 13:20:50

Agent-Reach 实战:用 Python CLI 快速构建可调试的 AI Agent

1. 从零认识 Agent-Reach:它到底解决什么问题Agent-Reach 这个名字,第一次看到的时候我以为是某个网络探测工具,后来翻了一圈资料才搞明白,它本质上是一个面向 AI Agent 的 CLI 工具层,用 Python 写的,核心…

2026/10/8 13:20:50

2026深圳罗湖大创客节:校园跳绳挑战赛解析

引言 健康生活与信息科技正在校园里越走越近。在 2026 深圳市罗湖区中小学第九届大创客节人工智能编程设计赛 的图形化赛项中,评委非常看重「用程序解决真实场景问题」的能力——把体育锻炼变成一款可玩、可计数的小游戏,正是这类赛事喜欢的方向。 今天…

2026/10/8 13:20:50

PA Agent 演示模式使用教程:零API成本回放历史K线分析记录

PA Agent 演示模式使用教程:零API成本回放历史K线分析记录 【免费下载链接】PA_Agent 项目地址: https://gitcode.com/gh_mirrors/pa/PA_Agent PA Agent 是一款基于价格行为学(Price Action)的 AI K 线分析工具,而它的演示…

2026/10/8 13:20:50

PS5串流全攻略:从局域网到远程,打造AnyPS5方案

如果你家里有一台PS5,大概率经历过这样的场景:客厅电视被家人占着,你想推两把游戏,却只能对着手机发呆。我试过把主机搬到卧室,结果第二天又得搬回去,HDMI线在背包里绕成一团麻花。后来我把目光转向了串流&…

2026/10/8 13:15:50

Spring Boot零基础入门:从环境搭建到MyBatis数据库实战

我最近在带几个完全零基础的同事转Java方向,发现一个很普遍的现象:大家一说学Spring Boot,第一反应就是去搜“SSM框架教程”,然后从Spring的IOC容器、Bean生命周期开始啃,啃了两个星期连一个能跑的HelloWorld都没写出来…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑