这是一个日期转换成年周的公式,现在不想用公式,想直接写在SQL里,Oracle和MySQL怎么表达?

image.png

FineReport 帆软用户VQHkSnUE2a 发布于 2025-8-12 08:37
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
华莉星宸Lv7专家互助
发布于2025-8-12 08:42(编辑于 2025-8-12 08:42)

Oracle

Oracle使用 TO_CHAR() 函数配合格式模型来获取周数:

  1. 'IW'(ISO周数)

    • 符合ISO 8601标准(周一到周日为一周,每年第一周包含该年的第一个星期四)。

    • 返回值范围:1–53。

    • 示例:sql

      SELECT TO_CHAR(SYSDATE, 'IW') AS week_num FROM dual; -- 返回当前日期的ISO周数
  2. 'WW'(传统周数)

    • 从每年1月1日开始计算第一周(无论星期几),之后每周从周日开始。

    • 返回值范围:1–53。

    • 示例:sql

      SELECT TO_CHAR(SYSDATE, 'WW') AS week_num FROM dual; -- 返回传统周数

推荐使用 'IW' 以获得国际标准周数。

MySQL

MySQL使用 WEEK() 函数,通过模式参数指定计算规则:

  1. 模式 3(ISO周数)

    • 符合ISO 8601标准(周一到周日为一周,第一周包含该年≥4天的周)。

    • 返回值范围:1–53。

    • 示例:sql

      SELECT WEEK(NOW(), 3) AS week_num; -- 返回当前日期的ISO周数
  2. 其他常用模式:

    • 模式 0:周日为周起始,第一周包含1月1日(返回值范围:0–53)。

    • 模式 1:周一为周起始,第一周包含≥4天(返回值范围:0–53)。

    • 模式 2:周日为周起始,第一周包含1月1日(返回值范围:1–53)。

推荐使用模式 3 以获得ISO标准周数。

关键区别

特性OracleMySQL
函数TO_CHAR(date, '格式')WEEK(date, 模式)
ISO周格式'IW'模式=3
返回值范围1–531–53 (模式≥2时)
周起始日周一 (ISO标准)由模式参数决定

示例场景

假设需要获取 2023-12-31(周日)的ISO周数:

  • Oracle:sql

    SELECT TO_CHAR(TO_DATE('2023-12-31', 'YYYY-MM-DD'), 'IW') FROM dual; -- 返回 52(属于2023年第52周)
  • MySQL:sql

    SELECT WEEK('2023-12-31', 3); -- 返回 52(属于2023年第52周)

  • 帆软用户VQHkSnUE2a 帆软用户VQHkSnUE2a(提问者) SELECT TO_CHAR(TO_DATE('2024-12-29', 'YYYY-MM-DD'), 'IW') FROM dual
    52周不对,因为我们是按照上周日到这周六为一个周别,那这个日前转换应该是2501
    2025-08-12 08:51 
  • 华莉星宸 华莉星宸 回复 帆软用户VQHkSnUE2a(提问者) 我建议你做一个日期维度表,把日期 和周对应上 直接从表里面取周数
    2025-08-12 09:05 
最佳回答
0
期待遇见youLv4初级互助
发布于2025-8-12 08:43

mysql  

SELECT

CASE

DAYOFWEEK( "2024-06-29" ) 

WHEN 1 THEN

'周日' 

WHEN 2 THEN

'周一' 

WHEN 3 THEN

'周二' 

WHEN 4 THEN

'周三' 

WHEN 5 THEN

'周四' 

WHEN 6 THEN

'周五' 

WHEN 7 THEN

'周六' 

END 周几, 

week (date) 第几周

oracle  

SELECT TO_CHAR(my_date, 'IW') AS week_number  -- 第几周 

FROM my_table; 

SELECT TO_CHAR(my_date, 'DAY') AS day_of_week  周几

FROM my_table;

最佳回答
0
shirokoLv6资深互助
发布于2025-8-12 08:54(编辑于 2025-8-12 08:55)

oracle :

select SUBSTR(TO_CHAR(TO_DATE('2024-12-31 01:01:01', 'YYYY-MM-DD HH24:MI:SS'), 'IYYY'), 3, 2) || TO_CHAR(TO_DATE('2024-12-31 01:01:01', 'YYYY-MM-DD HH24:MI:SS'), 'IW') AS year_week from dual

mysql:

SELECT

CONCAT(RIGHT(YEARWEEK(STR_TO_DATE('2024-12-31 01:01:01', '%Y-%m-%d %H:%i:%s'), 3) DIV 100, 2),

LPAD(YEARWEEK(STR_TO_DATE('2024-12-31 01:01:01', '%Y-%m-%d %H:%i:%s'), 3) % 100, 2, '0')

) AS year_week

  • 4关注人数
  • 37浏览人数
  • 最后回答于:2025-8-12 08:55
    请选择关闭问题的原因
    确定 取消
    返回顶部