在PostgreSQL(我使用的是9.6.6版)中,从星期日开始,获取周数的最简单方法是什么?DATE_PART('week',x)
返回:
一年中ISO 8601周编号周的编号。根据定义,ISO周从星期一开始,一年的第一周包含该年的1月4日。换句话说,一年的第一个星期四是在那一年的第一周。(doc)
比如说我的查询是这样的:
WITH dates as (SELECT generate_series(timestamp '2014-01-01',
timestamp '2014-01-31',
interval '1 day'
)::date AS date
)
SELECT
date,
TO_CHAR(date,'Day') AS dayname,
DATE_PART('week',date) AS weekofyear
FROM dates
回报率:
date dayname weekofyear
--------------------------------
2014-01-01 Wednesday 1
2014-01-02 Thursday 1
2014-01-03 Friday 1
2014-01-04 Saturday 1
2014-01-05 Sunday 1 <- I want this to be 2
2014-01-06 Monday 2
2014-01-07 Tuesday 2
2014-01-08 Wednesday 2
到目前为止,我已经尝试过:
SELECT
date,
TO_CHAR(date,'Day') AS dayname,
DATE_PART('week',date) AS week_iso,
DATE_PART('week',date + interval '1 day') AS week_alt
FROM dates
如果一年从星期天开始就不太管用了
此外,我希望第1周包含该年的1月1日。因此,如果1月1日是星期六,我希望第1周是一天(而不是ISO风格的第53周)。这种行为与Excel WEEKNUM function一致。
5条答案
按热度按时间rjjhvcjd1#
要获得一年中的周数,周从星期日开始,我们需要知道一年的第一天和目标日期之间有多少个星期日。
我改编了@Erwin Brandstetter的解决方案here。此解决方案计算星期日,包括一年的第一天,不包括目标日期。
然后,因为我希望第一周(部分)是第一周(而不是零),我需要添加1 *,除非 * 一年的第一天是星期日(在这种情况下,它已经是第一周)。
返回
为了展示从周日开始的几年里这是如何运作的:
vybvopom2#
这项任务并不像它最初看起来那样令人生畏。它主要要求在1月1日或之后找到第一个太阳。这一天成为第一周的最后一天。从那里计算随后的几周仅仅是。一个附加的问题。另一个重要的一点是,对于周的定义,每年总是有53周,最后一周的最后一天是12月31日。下面的代码生成此周定义的年度日历。
一般来说,我避免使用幻数,但有时它们也很有用;就像这个案子一样在幻数(实际上是一个字符串)'0654321'中,每个数字代表在1月1日或之后到达第一个星期一所需的天数,当按标准的日编号系统(0-6作为太阳-星期六)索引时。结果是星期一是第一周的最后一天。它生成递归CTE的第一行。剩下的行只是为每周添加适当的天数,直到生成53周。
以下显示了确保每周的每一天都轮到1月1日所需的年份(是的,有些日子重复)。运行个别年份以验证其日历。
tvmytwxo3#
以下可能工作-测试与两种情况下记住:
输出量:
doinxwow4#
这个查询可以完美地将星期一替换为星期日作为一周的开始。
查询
输出
ovfsdjhp5#
我这样处理这个问题,以模仿excel weeknum(在插入过程中设置周数):