如何编写SQL查询将nvarchar/字符串转换为日期类型?
处理混合日期与文本列的SQL转换方案
嘿,这个需求太常见啦——当你的表列里混着日期格式字符串和普通文本,只想把符合格式的日期转成标准的YYYY-MM-DD,其他内容原封不动保留。下面我针对几种主流数据库给出具体的SQL写法,你可以根据自己用的数据库来选:
MySQL 实现
MySQL里可以用STR_TO_DATE尝试转换,转换失败会返回NULL,再用IFNULL兜底取原字符串:
SELECT IFNULL(STR_TO_DATE(comment, '%m/%d/%Y'), comment) AS comment FROM usercomment;
STR_TO_DATE(comment, '%m/%d/%Y'):按照MM/DD/YYYY的格式尝试将字符串转成日期,不符合格式的会返回NULLIFNULL(...):如果转换结果是NULL,就直接用原comment值,完美保留普通文本
PostgreSQL 实现
PostgreSQL 12及以上版本支持TRY_TO_DATE函数,转换失败返回NULL,结合TO_CHAR转成标准日期字符串:
SELECT COALESCE(TO_CHAR(TRY_TO_DATE(comment, 'MM/DD/YYYY'), 'YYYY-MM-DD'), comment) AS comment FROM usercomment;
如果是低于12的版本,可以先用正则表达式判断格式,再做转换:
SELECT CASE WHEN comment ~ '^\d{2}/\d{2}/\d{4}$' THEN TO_CHAR(TO_DATE(comment, 'MM/DD/YYYY'), 'YYYY-MM-DD') ELSE comment END AS comment FROM usercomment;
- 正则
^\d{2}/\d{2}/\d{4}$用来匹配XX/XX/XXXX格式的字符串,确保只有符合日期格式的内容才会被转换
SQL Server 实现
用TRY_CONVERT尝试转换日期,成功后再转成标准格式的字符串,失败则保留原内容:
SELECT COALESCE(CONVERT(VARCHAR, TRY_CONVERT(DATE, comment, 101), 23), comment) AS comment FROM usercomment;
TRY_CONVERT(DATE, comment, 101):样式101对应MM/DD/YYYY格式,转换失败返回NULLCONVERT(VARCHAR, ..., 23):将成功转换的日期转成YYYY-MM-DD格式的字符串COALESCE:如果转换失败,就取原comment值
用上面的SQL跑你的测试数据,就能得到你想要的输出结果啦~
内容的提问来源于stack exchange,提问作者Phanindra Pothuri
相关产品推荐
相关产品推荐

