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

如何基于SQL表的Year、Month列生成指定日的Date列并处理空值

问题描述

我的SQL表包含Year和Month列(无Day列),数据示例如下:

YearMonth
201010
20088
202111
NullNull
20092

我希望生成日期类型的Date列,格式为YYYY-MM-DD:

  • YYYY取Year列值
  • MM取Month列值
  • DD固定为15
  • 当Year或Month为空时,Date列值为Null

理想结果如下:

Date
2010-10-15
2008-08-15
2021-11-15
Null
2009-02-15

我尝试用以下语句:

CONCAT(Year,'-',Month,'-',15) as Date

结果空值行显示为--15而非Null,且生成的列不是日期类型,请求解决。

解决方案

核心思路

  1. 优先判断Year和Month是否为空,只要有一个为空则返回Null
  2. 将合法的年月组合转换为标准日期类型,避免生成无效字符串

不同数据库的实现代码

MySQL/MariaDB

使用STR_TO_DATE转换为日期类型,配合CASE处理空值,可选LPAD补全月份为两位:

SELECT 
  CASE 
    WHEN Year IS NOT NULL AND Month IS NOT NULL 
    THEN STR_TO_DATE(CONCAT(Year, '-', LPAD(Month, 2, '0'), '-15'), '%Y-%m-%d') 
    ELSE NULL 
  END AS Date
FROM your_table;

SQL Server

直接使用DATEFROMPARTS函数,该函数会自动在参数为空时返回Null,且生成标准日期类型:

SELECT DATEFROMPARTS(Year, Month, 15) AS Date
FROM your_table;

PostgreSQL

使用MAKE_DATE函数转换为日期类型,配合空值判断:

SELECT 
  CASE 
    WHEN Year IS NOT NULL AND Month IS NOT NULL 
    THEN MAKE_DATE(Year::INT, Month::INT, 15) 
    ELSE NULL 
  END AS Date
FROM your_table;

说明

  • 所有方案返回的都是日期类型列,而非字符串格式
  • 空值场景下会返回Null,彻底避免--15这类无效结果
  • 部分数据库的内置日期函数(如SQL Server的DATEFROMPARTS)可自动处理空值,无需额外判断逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:30:30