SQL Server合并datetime列报错:varchar转datetime超出范围
解决SQL Server中日期合并为逗号分隔列表的类型转换错误
嘿,我一眼就看出问题出在哪了——你在合并日期时遇到的那个varchar转datetime的范围错误,其实是隐式类型转换在捣乱!
错误原因拆解
你直接写了, ' + X.SALE_DT这种拼接逻辑,SQL Server会因为数据类型优先级规则,优先尝试把字符串, 转换成datetime类型,但显然, 根本不是合法的日期格式,自然就抛出了"超出范围"的错误。
正确的解决思路
核心就是:先把datetime类型的SALE_DT转换成字符串,再和分隔符拼接。而且最好用CONVERT指定明确的日期格式,避免不同服务器环境下的格式混乱。
完整的正确查询语句
SELECT T.ID, STUFF( ISNULL( (SELECT ', ' + CONVERT(VARCHAR(20), X.SALE_DT, 120) FROM #TEMP1 X WHERE X.ID = T.ID GROUP BY X.SALE_DT FOR XML PATH ('')), '' ), 1, 2, '' ) AS MergedSaleDates FROM #TEMP1 T GROUP BY T.ID;
关键细节说明
CONVERT(VARCHAR(20), X.SALE_DT, 120):把datetime转成yyyy-mm-dd hh:mi:ss的ISO标准格式字符串,兼容性拉满。你也可以根据需求换格式码,比如101对应mm/dd/yyyy,103对应dd/mm/yyyy。STUFF(..., 1, 2, ''):用来去掉结果开头多余的,——因为拼接后的字符串会默认以,开头,这个操作从第1个字符开始,替换2个字符为空,刚好去掉前缀。
额外小提醒:插入数据的日期格式坑
你的插入语句用了'1/12/2011 12:00 AM'这种格式,在SQL Server不同语言环境下可能会被解析成不同日期(比如英语环境是1月12日,法语环境是12月1日)。如果要彻底避免这种问题,建议用ISO标准格式插入:
INSERT INTO #TEMP1 VALUES ('2011-01-12 00:00:00', 12345) INSERT INTO #TEMP1 VALUES ('2011-03-11 00:00:00', 12345)
这样不管服务器语言设置是什么,都能精准解析日期。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

