如何基于SQL表的Year、Month列生成指定日的Date列并处理空值
问题描述
我的SQL表包含Year和Month列(无Day列),数据示例如下:
| Year | Month |
|---|---|
| 2010 | 10 |
| 2008 | 8 |
| 2021 | 11 |
| Null | Null |
| 2009 | 2 |
我希望生成日期类型的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,且生成的列不是日期类型,请求解决。
解决方案
核心思路
- 优先判断
Year和Month是否为空,只要有一个为空则返回Null - 将合法的年月组合转换为标准日期类型,避免生成无效字符串
不同数据库的实现代码
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
相关产品推荐
相关产品推荐

