MsSQL中CONCAT对DATETIME列格式化异常的控制方法问询
问题分析与解决方案
原因说明
直接执行select A from dbo.xxx;时,数据库返回的是datetime类型的二进制原始数据,最终显示的1900-01-01 00:00:00.000格式是由你的客户端工具(如SSMS、Azure Data Studio)根据自身默认设置转换生成的(通常为ODBC规范格式)。
而select CONCAT('', A) from dbo.xxx;会触发SQL Server的隐式类型转换:将datetime值转为字符串后再拼接,这个转换的格式由当前会话的语言、日期格式配置决定,默认情况下美式英语环境会生成Jan 1 1900 12:00AM这类格式,因此结果和直接查询不同。
解决方案
如果不想使用convert(VARCHAR, A, 121)这类显式带样式的转换,可以通过调整会话级别的配置实现需求:
1. 临时调整当前会话的格式(推荐)
执行以下语句修改当前会话的语言和日期格式,之后再运行CONCAT查询,就能得到和直接查询一致的字符串格式:
SET LANGUAGE us_english; SET DATEFORMAT ymd;
注意:该设置仅对当前数据库连接会话有效,断开连接后会自动恢复默认配置。
2. 永久修改服务器默认配置(谨慎操作)
如果需要所有数据库会话都采用该格式,可以修改服务器的默认语言(1033对应美式英语),但这会影响所有数据库对象的日期相关行为,需评估后执行:
sp_configure 'default language', 1033; RECONFIGURE;
补充提示
虽然你明确不想使用显式转换,但还是需要说明:convert(VARCHAR, A, 121)是最稳定的方案——它不受语言、格式配置的影响,始终返回固定的yyyy-MM-dd HH:mm:ss.fff格式,适合需要确保结果一致性的场景。
内容的提问来源于stack exchange,提问作者foxygun
相关产品推荐
相关产品推荐

