You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:20:10