如何将YYMMDDhhmm格式的NVARCHAR转换为YYYY-MM-DD hh:mm:ss格式的DATETIME?
问题:将nvarchar类型的
2208111603转换为datetime类型的2022-08-11 00:00:00 需要将值2208111603(nvarchar类型)转换为2022-08-11 00:00:00(datetime类型)。尝试过的方法及对应的错误如下:
CAST(DATE_TIME AS numeric)可以执行,但CAST(CAST(DATE_TIME AS numeric) AS datetime)返回算术溢出错误。convert(datetime2, CAST(DATE_TIME AS numeric), 105)返回错误:不允许从数据类型numeric显式转换为datetime2。
CONVERT(datetime2, DATE_TIME , 105)返回错误:从字符串转换日期和/或时间时失败。
CONVERT(datetime2, CONVERT(CHAR(10), DATE_TIME), 105)返回错误:从字符串转换日期和/或时间时失败。
PARSE(DATE_TIME AS date USING 'en-US')返回错误:使用区域设置'en-US'将字符串值'2208111603'转换为date数据类型时出错。
SELECT convert(datetime,'2208111603',112)返回错误(Msg 241):从字符串转换日期和/或时间时失败。
解决方案
问题出在字符串格式2208111603为YYMMDDHHMM格式,SQL Server的CONVERT内置格式不直接支持该格式,需先拆分重组为可识别的日期格式:
方法1:字符串拼接重组后转换
提取前6位(YYMMDD),拼接成YYYY-MM-DD格式再转换:
SELECT CONVERT(datetime, '20' + LEFT('2208111603', 2) + '-' + SUBSTRING('2208111603', 3, 2) + '-' + SUBSTRING('2208111603', 5, 2), 23)
若为字段DATE_TIME,替换为字段名即可:
SELECT CONVERT(datetime, '20' + LEFT(DATE_TIME, 2) + '-' + SUBSTRING(DATE_TIME, 3, 2) + '-' + SUBSTRING(DATE_TIME, 5, 2), 23)
方法2:使用STUFF函数简洁重组
利用STUFF插入分隔符,简化拼接逻辑:
SELECT CONVERT(datetime, STUFF(STUFF('20' + LEFT(DATE_TIME, 6), 7, 0, '-'), 5, 0, '-'), 23)
解释:'20' + LEFT(DATE_TIME,6)得到20220811,通过STUFF在第5、7位插入-,转为2022-08-11,最后用格式23(ISO日期格式)转换为datetime。
方法3:保留时间部分的转换
若需保留原字符串中的16:03时间,可重组为完整的YYYY-MM-DD HH:MM:SS格式:
SELECT CONVERT(datetime, '20' + LEFT(DATE_TIME, 2) + '-' + SUBSTRING(DATE_TIME, 3, 2) + '-' + SUBSTRING(DATE_TIME, 5, 2) + ' ' + SUBSTRING(DATE_TIME, 7, 2) + ':' + SUBSTRING(DATE_TIME, 9, 2) + ':00', 120)
内容的提问来源于stack exchange,提问作者K H A N
相关产品推荐
相关产品推荐

