能,convert(varchar, date, 120) 在 sql server 中输出 yyyy-mm-dd hh:mi:ss 格式(无毫秒、无时区),但仅限 sql server;mysql 等不支持该语法,且 null、非日期类型或错误 style 会导致异常。

CONVERT(VARCHAR, date, 120) 在 SQL Server 中是否真能输出标准时间字符串?
能,但仅限于 SQL Server(含 Azure SQL),且 120 对应的是 yyyy-mm-dd hh:mi:ss 格式(不含毫秒、无时区),属于 ODBC 规范的“通用日期格式”。MySQL、PostgreSQL、Oracle 都不支持这个语法——直接执行会报错 Invalid column name '120' 或类似提示。
为什么有时结果里时间部分为空或变成 1900-01-01?
常见原因有三个:
-
date列实际是NULL,CONVERT返回NULL,若前端没处理,可能显示为空或默认值 - 列类型不是日期类(比如存的是
VARCHAR且内容为'2024/3/15'),SQL Server 尝试隐式转换失败,回退为基准日期1900-01-01 - 用了错误的 style 值:比如把
120写成'120'(加了引号),SQL Server 当作字符串字面量而非 style 参数,导致类型不匹配
如何安全地用 CONVERT 输出可预期的字符串?
推荐写法带显式类型声明和 NULL 处理:
SELECT ISNULL(CONVERT(VARCHAR(19), your_date_column, 120), '') AS formatted_time FROM your_table WHERE your_date_column IS NOT NULL;
关键点:
-
VARCHAR(19)足够容纳yyyy-mm-dd hh:mi:ss(19 个字符),比VARCHAR(MAX)或无长度更可控 - 避免对非
DATE/DATETIME/DATETIME2类型列直接用CONVERT(..., 120);先用TRY_CONVERT(DATETIME2, col)验证再转 - 如果需要毫秒,改用 style
121:CONVERT(VARCHAR(23), getdate(), 121)→2024-03-15 14:30:22.123
替代方案:FORMAT 函数更灵活但代价更高
FORMAT 支持自定义模板(如 'yyyy-MM-dd HH:mm:ss'),也兼容 NULL 输入返回 NULL,但它在大数据量下性能明显低于 CONVERT,且仅 SQL Server 2012+ 可用:
SELECT FORMAT(your_date_column, 'yyyy-MM-dd HH:mm:ss') FROM your_table;
注意:FORMAT 返回 NVARCHAR,若下游要求 VARCHAR,需额外 CAST;另外它依赖会话语言设置,HH 在某些语言下可能变成小写 hh。
真正容易被忽略的是:style 值 120 不处理时区——哪怕源列是 DATETIMEOFFSET,CONVERT(VARCHAR, ..., 120) 也会丢掉偏移量,只取本地等效时间。需要保留时区信息,必须用 SWITCHOFFSET 或 TODATETIMEOFFSET 配合处理。











