如何将nvarchar列中仅有效日期值转换为DateTime其余保留原值?
实现方案说明
首先明确SQL的基础规则:单个列的数据类型必须全局统一,因此无法在同一列中同时存储DateTime类型的日期值和nvarchar类型的普通字符串,你可以根据使用场景选择以下两种可行方案:
方案1:输出统一为字符串类型(兼容所有原始值)
将有效日期转换为指定格式的日期字符串,非日期值保留原始内容输出,所有结果的类型均为字符串,适配需要在同一列展示所有内容的场景。
SQL Server 实现(2012及以上版本)
SELECT CASE -- 103为日期格式码,对应dd/MM/yyyy,若你的日期是MM/dd/yyyy格式可替换为101 WHEN TRY_CONVERT(DATETIME, DateFrom, 103) IS NOT NULL -- 23为输出格式码,对应yyyy-MM-dd,可按需替换为其他日期格式 THEN CONVERT(NVARCHAR(100), TRY_CONVERT(DATETIME, DateFrom, 103), 23) ELSE DateFrom END AS Processed_DateFrom FROM 你的表名
MySQL 实现
SELECT CASE WHEN STR_TO_DATE(DateFrom, '%d/%m/%Y') IS NOT NULL THEN DATE_FORMAT(STR_TO_DATE(DateFrom, '%d/%m/%Y'), '%Y-%m-%d') ELSE DateFrom END AS Processed_DateFrom FROM 你的表名
方案2:拆分两列输出(保留日期类型可计算属性)
拆分为原始值列和转换后日期列,有效日期的行在日期列返回合法的DateTime类型值,可直接用于日期计算、排序等操作,非日期的行日期列返回NULL。
SQL Server 示例
SELECT DateFrom AS Original_Value, TRY_CONVERT(DATETIME, DateFrom, 103) AS Converted_DateTime FROM 你的表名
MySQL 示例
SELECT DateFrom AS Original_Value, STR_TO_DATE(DateFrom, '%d/%m/%Y') AS Converted_DateTime FROM 你的表名
内容的提问来源于stack exchange,提问作者TechMan
相关产品推荐
相关产品推荐

