【问题标题】:How to get Year/Week according to ISO?如何根据 ISO 获得年/周?
【发布时间】:2021-07-22 21:02:13
【问题描述】:

我有下面的代码,它给出了第 202153 周。但是,我需要将 2021 年的第一周改为 202153,而不是 202053。

是否有任何内置功能可以解决这个问题?

SELECT
    to_char(TO_DATE('20210104', 'YYYYMMDD') - 3, 'YYYYIW') AS yearweek
FROM
    dual

预期输出:202053。我可以简单地解码该值,但我希望未来几年有一个更强大的解决方案。

【问题讨论】:

  • 可能使用符合 ISO-8601 的官方格式:TO_CHAR(..., 'IYYY"W"IW'),以避免格式不明确YYYYMM
  • 对不起,你说的模棱两可是什么意思?
  • 根据 ISO-8601 202112 表示“2021 年 12 月”。 2021 年第 12 周的官方格式为 2021-W122021W12

标签: sql oracle iso


【解决方案1】:

使用IYYY(ISO 年)而不是YYYY(日历年)格式模型。

SELECT TO_CHAR( DATE '2021-01-04' - 3, 'IYYYIW') AS yearweek
FROM   DUAL

哪些输出:

YEARWEEK
202053

db小提琴here

【讨论】:

  • 谢谢!我注意到您已包含 DATE '2021-01-04'。有没有什么方法可以在不使用 to_date 的情况下为“20210104”实现相同的效果?
  • @jeiv DATE '2021-01-04' 是一个日期文字。 '20210104' 是字符串文字,需要强制转换才能将其转换为日期;虽然理论上您可以使用ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDD'; 然后SELECT TO_CHAR( CAST( '20210103' AS DATE )- 3, 'IYYYIW') AS yearweek FROM DUAL,但隐式依赖使用这样的格式模型是不好的做法。只需使用TO_DATE 将字符串转换为日期。
猜你喜欢
  • 2021-12-13
  • 2020-01-22
  • 2015-01-11
  • 1970-01-01
  • 2016-05-02
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多