【问题标题】:Week Day Starting from a Certain Day (01 Jan 2021) in Postgres从 Postgres 中的某一天(2021 年 1 月 1 日)开始的工作日
【发布时间】:2021-12-28 18:59:43
【问题描述】:

我正在尝试从某一天开始获取一年中的周数 我检查了堆栈,但很困惑。

SELECT EXTRACT(WEEK FROM TIMESTAMP '2021-01-01'),
       extract('year' from TIMESTAMP '2021-01-01')

输出为 53|2021

我希望它是 01|2021

我了解等周的原理,但我希望年份从 2021 年 1 月 1 日开始

目的是使用这一天的间隔来确定周数

Week N0| End Date
     1 | 01-01-2021
     2 | 01-08-2021
     5 | 01-29-2021
...

【问题讨论】:

  • 显然你错过了 ISO 周的重点。 ISO 周总是从星期一开始,但您希望从星期五开始 - 没有发生。此外,ISO 年的第一周是 1 月 4 日或之前的星期一。这有时会导致意想不到的结果,因为 1 月的开始日期可能在上一个日历年的最后一周,或者 12 月的最后几天在下一个日历年的第一个日历周。
  • 表达式 extract( 'week' from somedate) 返回 ISO 周数,要保持一致,您需要 extract('isoweek' from somedate) 。所以对于你的数据:select extract('week' from date '2021-01-01'), extract('isoyear' from date '2021-01-01');正如@a_horse_with_no_name 所指示的,您需要计算任何其他星期的确定。

标签: postgresql week-number


【解决方案1】:

这确实是一种奇怪的确定周数的方法,但最终它是一个简单的数学运算:从一月开始的天数除以 7。

您可以为此创建一个函数:

create function custom_week(p_input date)
  returns int
as
$$
   select (p_input - date_trunc('year', p_input)::date) / 7 + 1;
$$
language sql
immutable;

所以这个:

select date, custom_week(date)
from (
  values 
    (date '2021-01-01'), 
    (date '2021-01-08'), 
    (date '2021-01-29')
) as v(date)

产量

date       | custom_week
-----------+------------
2021-01-01 |           1
2021-01-08 |           2
2021-01-29 |           5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多