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

SQL CASE语句空日期返回1900-01-01的问题如何解决?

解决SQL CASE语句返回1900-01-01而非NULL的问题

你的问题出在ELSE子句返回空字符串'':因为目标列是日期类型,SQL会自动将空字符串隐式转换为日期类型的默认值1900-01-01,而非你期望的空白或NULL。

解决方案1:返回NULL(推荐)

直接在ELSE里返回NULL,NULL是日期类型的合法值,不会触发隐式转换:

CASE WHEN game_startA IS NOT NULL THEN game_startA 
     WHEN game_startB IS NOT NULL THEN game_startB 
     ELSE NULL 
     END AS 'Game Start Date'
,
CASE WHEN game_endA IS NOT NULL THEN game_endA 
     WHEN game_endB IS NOT NULL THEN game_endB 
     WHEN COALESCE(game_endC, game_endD) IS NOT NULL THEN COALESCE(game_endC, game_endD)
     ELSE NULL 
     END AS 'Game End Date'

还可以用COALESCE简化写法,效果完全一致:

COALESCE(game_startA, game_startB) AS 'Game Start Date',
COALESCE(game_endA, game_endB, game_endC, game_endD) AS 'Game End Date'

解决方案2:返回空白字符串(需显式类型转换)

如果业务要求必须返回空白而非NULL,需要将整个CASE表达式的结果转换为字符串类型(以SQL Server为例,用CAST或CONVERT):

CAST(
    CASE WHEN game_startA IS NOT NULL THEN game_startA 
         WHEN game_startB IS NOT NULL THEN game_startB 
         ELSE NULL 
    END AS VARCHAR(10)
) AS 'Game Start Date'
,
CAST(
    CASE WHEN game_endA IS NOT NULL THEN game_endA 
         WHEN game_endB IS NOT NULL THEN game_endB 
         WHEN COALESCE(game_endC, game_endD) IS NOT NULL THEN COALESCE(game_endC, game_endD)
         ELSE NULL 
    END AS VARCHAR(10)
) AS 'Game End Date'

简化版:

CAST(COALESCE(game_startA, game_startB) AS VARCHAR(10)) AS 'Game Start Date',
CAST(COALESCE(game_endA, game_endB, game_endC, game_endD) AS VARCHAR(10)) AS 'Game End Date'

注意:如果用CONVERT可以指定日期格式,比如CONVERT(VARCHAR(10), COALESCE(...), 23)对应YYYY-MM-DD格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:40:47