gpt4 book ai didi

sql - 将 Year+WeekOfYear+DayOfWeek 转换为日期

转载 作者:行者123 更新时间:2023-11-29 12:39:29 26 4
gpt4 key购买 nike

我有由年份、该年的周数和工作日标识的日期值,我想将它们转换为简单的日期。

我找不到一个函数或其他简单的方法来组合这些,所以我想出了一个解决方法,使用 generate_series 来获取一个范围内的所有日期,并将这些提取的值与我的数据:

SELECT data.*, days.d result
FROM ( VALUES (2017, 33, 3) ) data(d_year, d_week, d_weekday)
JOIN (
SELECT
-- the potential castdate
d::date d
-- year-week-dayofweek combination for JOINing
, EXTRACT('year' FROM d) d_year, EXTRACT('week' FROM d) d_week, EXTRACT('dow' FROM d) d_weekday
FROM generate_series('2015-01-01', '2019-12-31', INTERVAL '1day') AS days(d)
) days
USING(d_year, d_week, d_weekday)

结果是:

+--------+--------+-----------+------------+
| d_year | d_week | d_weekday | result |
+--------+--------+-----------+------------+
| 2017 | 33 | 3 | 16.08.2017 |
+--------+--------+-----------+------------+

虽然这可行,但对于这样一个简单的任务来说这似乎有点过分了。此外,如果没有固定范围,这甚至可能行不通。

有更简单的方法吗?

最佳答案

demo:db<>fiddle

您可以使用 to_date() 函数,该函数将日期字符串和格式模式作为参数。因此,如果日期字符串可能是 '2017-33-3',您可以采用此模式来阐明每个日期部分:

'IYYY-IW-ID'
  1. 'ID':棘手的部分是:您的一周是从星期日开始还是从星期一开始?这个问题会影响解决方案,因为如果您不考虑它,它会以意想不到的方式改变周数。感谢您的预期输出,我发现您需要 'ID'(ISO 工作日,一周从星期一开始)而不是 'D'(工作日,一周从星期日开始。)
  2. 'IW':因为我们采用 ISO 工作日,所以我们还需要 ISO 一年中的一周(而不是 'WW':一年中的一周)
  3. 'IYYY':类似于(2)

有关日期模式(尤其是 ISO 的东西)的更多信息:Postgres documentation

SELECT to_date(d_year || '-' || d_week || '-' || d_weekday, 'IYYY-IW-ID')

如果您使用标准周模式:'YYYY-WW-D',您的结果将是 2017-08-13(参见 fiddle )


当然,这在没有 - 字符的情况下也有效,但它的可读性可能较差:

SELECT to_date(d_year || d_week || d_weekday, 'IYYYIWID')

关于sql - 将 Year+WeekOfYear+DayOfWeek 转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58204290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com