You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Microsoft Fabric的Spark SQL中将日期字符串转为日期格式

解决Microsoft Fabric Spark SQL中日期字符串转换问题

问题核心

你当前转换失败的直接原因是to_timestamp的格式参数与Budget_Date的实际格式不匹配:

  • Budget_Date的格式为dd MMM yyyy(例如30 May 2024、3 Dec 2022)
  • 你传入的格式参数是dd/MM/yyyy,两者完全不匹配,导致转换返回NULL

解决方案

1. 修正日期转换的格式参数

根据你的需求,有两种合适的函数可选:

  • 若仅需日期类型,使用to_date更贴合场景
  • 若需保留时间戳类型,继续用to_timestamp,但格式参数必须改为dd MMM yyyy

2. 优化序数词处理逻辑

原CTE中多次嵌套REPLACE处理th/nd/st/rd的写法可以简化为regexp_replace,通过正则表达式一次性替换所有序数词后缀,代码更简洁高效。

3. 处理特殊值PLACEHOLDER

避免对PLACEHOLDER执行日期转换,否则会触发转换错误,需通过条件判断跳过这类值。

修改后的完整代码

out = spark.sql(f"""
with cte1 as (
SELECT
    TITLE
    ,SYSTEMONLY as System_Only
    ,IF(SYSTEMONLY = "Yes",
        IF(len(TITLE) <= 28 AND TITLE LIKE '&Snapshot%',
            "PLACEHOLDER",
            -- 正则一次性替换所有序数词后缀
            regexp_replace(
                SUBSTRING(
                    TRIM(SUBSTRING(TITLE, INSTR(TITLE,' - ') + 3, LEN(TITLE))),
                    1,
                    len(TRIM(SUBSTRING(TITLE, INSTR(TITLE,' - ') + 3, LEN(TITLE)))) -6
                ),
                '(st|nd|rd|th)', ''
            )
        ),
        NULL
    ) as Budget_Date
FROM LakehouseName.TableName
WHERE SYSTEMONLY = 'Yes'
)
SELECT 
    TITLE, 
    System_Only, 
    Budget_Date,
    -- 仅对非PLACEHOLDER的值执行日期转换
    CASE 
        WHEN Budget_Date != 'PLACEHOLDER' THEN to_date(Budget_Date, 'dd MMM yyyy')
        ELSE NULL
    END AS Formatted_Date
FROM cte1
""")
display(out)

关键说明

  • regexp_replace(..., '(st|nd|rd|th)', ''):通过正则匹配所有序数词后缀,一次性完成替换,比多次REPLACE更高效。
  • to_date(Budget_Date, 'dd MMM yyyy'):MMM对应英文月份缩写(May、Dec等),Spark SQL可自动识别该格式。
  • CASE语句:规避对PLACEHOLDER的无效转换,防止出现报错。

内容的提问来源于stack exchange,提问作者DaarioNaharis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:25:58