 的用法与扩展)
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载导读在 PostgreSQL 中日期与时间处理是日常查询的常见需求而给定一个日期判断它是一周中的星期几就是其中很典型的一个问题。本篇基于 TIL 仓库中的 postgres/day-of-week-for-a-date.md 笔记展开完整讲解如何用date_part(dow, ...)把日期转换为0 ~ 6的星期编号0 为星期日、6 为星期六并进一步介绍extract()等价写法、ISO 8601 标准的isodow编号以及用to_char()输出Monday这类星期名称的方法。读完本篇你可以在WHERE过滤、GROUP BY聚合等场景中直接落地这些写法。从日期到星期几date_part(dow, ...)PostgreSQL 中判断某个日期是星期几最直接的方式是使用date_part()函数传入字段名dowday of week和目标日期。首先把字符串字面量转换成标准的date类型 select 2050-1-1::date; date ------------ 2050-01-01然后用date_part(dow, ...)取出该日期的星期编号 select date_part(dow, 2050-1-1::date); date_part ----------- 6结果为6表示 2050-01-01 是星期六。date_part()的两个参数分别是参数说明第一个参数text要提取的时间单位字段名这里传入dow第二个参数date/timestamp待计算的日期或时间戳dow取值空间为0 ~ 6与星期的一一对应关系如下dow 值星期0Sunday星期日1Monday星期一2Tuesday星期二3Wednesday星期三4Thursday星期四5Friday星期五6Saturday星期六该取值映射是笔记原文明确给出的约定0 为星期日、6 为星期六也是 PostgreSQL 官方日期时间函数文档中的既有定义。date_part()不只支持dow还支持year、month、day、hour、minute、doy一年中的第几天、week一年中的第几周、quarter等字段因此它本质上是从日期/时间值中提取任意时间分量的通用工具。等价的extract()写法extract()是date_part()的 SQL 标准风格等价写法语义完全一致 select extract(dow from 2050-1-1::date); extract --------- 6两者返回类型略有差异date_part()返回double precision而extract()在 PostgreSQL 中返回numeric。在多数场景下可以直接互换具体选择取决于查询风格和个人习惯。ISO 8601 视角isodow编号dow的0 ~ 6编号以星期日作为一周的起点但国际标准 ISO 8601 规定一周从星期一开始。为此 PostgreSQL 提供了isodowISO day of week字段isodow 值星期1Monday星期一2Tuesday星期二3Wednesday星期三4Thursday星期四5Friday星期五6Saturday星期六7Sunday星期日用法与dow完全一致 select date_part(isodow, 2050-1-1::date); date_part ----------- 6当业务逻辑或报表需要按周一为一周起始的口径统计时isodow比dow更贴合 ISO 标准也能避免星期日排在0位带来的排序与判断歧义。按名称输出星期几to_char()模板模式如果需要的不是数字编号而是 Monday、Tuesday 这样的可读名称可以用to_char()配合格式化模板。这与本仓库的姊妹笔记 postgres/day-of-week-by-name-for-a-date.md 所讲解的技巧相互呼应 select to_char(now(), Day); to_char ----------- Sundayto_char()的第二个参数是日期时间格式化模板常用的星期相关模式包括模板模式输出含义Day完整星期名称如Monday输出会补齐到固定宽度Dy缩写星期名称如MonD数字星期编号取值1 ~ 7星期日为 1IDISO 8601 数字星期编号取值1 ~ 7星期一为 1注意D与dow的编号起点不同D从 1 开始且星期日是 1而dow从 0 开始且星期日是 0混用时容易踩坑。需要名称时优先用Day/Dy需要 ISO 编号时优先用ID或isodow。实战按星期几过滤与聚合掌握了取星期的方法后最常见的落地场景有两个。过滤特定星期的记录例如查询某张表中所有在星期日创建的行select * from orders where date_part(dow, created_at) 0;若团队约定使用 ISO 编号也可写作select * from orders where extract(isodow from created_at) 7; -- ISO 标准下星期日为 7按星期几分组统计把date_part(dow, ...)放进GROUP BY可以统计一周中每一天的订单数量这正是本仓库 postgres/group-by-the-result-of-a-function-call.md 中按函数调用结果分组思路的直接应用select date_part(dow, created_at) as dow, count(*) as order_count from orders group by date_part(dow, created_at) order by dow;还可以叠加to_char()让分组标签更可读select to_char(created_at, Day) as weekday, count(*) as order_count from orders group by to_char(created_at, Day) order by min(created_at);注意GROUP BY中使用的表达式必须与SELECT中的表达式保持一致或者借助本仓库 postgres/use-argument-indexes.md 中介绍的按参数序号分组group by 1来简化书写。时区与类型提示dow的计算结果依赖输入值的类型与会话时区设置对纯date类型如2050-1-1::date不涉及时区结果稳定可复现对timestamp with time zonetimestamptz类型PostgreSQL 会先在当前会话时区下做转换再提取星期编号。因此同一条时间戳在不同时区会话中可能得出不同的dow跨时区场景下要注意先统一timezone会话设置可参考仓库笔记 postgres/configure-the-timezone.md。小结用date_part(dow, some_date)或extract(dow from some_date)获取星期编号范围0 ~ 60 Sunday、6 Saturday需要 ISO 8601 口径时改用isodow1 Monday、7 Sunday需要可读名称时用to_char(some_date, Day)缩写用Dydow与格式化模板D的编号起点不同D中星期日为 1切换时务必确认语义该技巧可直接用于WHERE过滤与GROUP BY聚合实现按星期维度的数据分析。更多 PostgreSQL 日期与时间处理技巧可继续翻阅仓库的 postgres 目录例如 postgres/day-of-week-by-name-for-a-date.md、postgres/constructing-a-range-of-dates.md、postgres/group-by-the-result-of-a-function-call.md 等笔记。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐PostgreSQL 按星期名称获取日期to_char 模板模式实战PostgreSQL 按星期名称获取日期to_char 模板模式实战 在 PostgreSQL 中获取某个日期对应的星期几除了用 date_part 得到文档教程知识库5分钟搞定Layui日期组件显示星期几的3种实用方案5分钟搞定Layui日期组件显示星期几的3种实用方案 你是否在使用Layui的日期选择器Laydate时遇到过需要显示星期几的需求比如预约系统需要明确标前端UI组件5分钟解决Layui Laydate日期选择器显示星期几的3种实用方案5分钟解决Layui Laydate日期选择器显示星期几的3种实用方案 在日常开发中用户常常需要在日期选择器中直观看到星期信息比如排班系统、日程管理工具等前端UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考