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

MSSQL中nvarchar转datetime插入后格式不符问题求助

搞定SQL Server里Datetime显示格式的问题

嘿,先给你理清一个核心误区:SQL Server的datetime类型根本不是存成字符串的,它是用二进制格式存储的。你看到的2018-05-18 11:09:31.000只是查询工具(比如SSMS)默认的显示样式,不是数据实际存在库里的样子。

你的插入语句其实没毛病——convert(datetime,@SESSION_START_TIME,105)已经正确把'18-05-2018 12:12:10 PM'转换成了datetime类型的值,只是显示的时候用了工具的默认格式而已。

正确的处理姿势

如果你想要看到18-05-2018 11:09:31 AM这种格式,应该在查询数据的时候做格式转换,而不是修改插入逻辑:

方式1:用CONVERT拼接格式

SELECT CONVERT(NVARCHAR(20), SESSION_START_DATE, 105) + ' ' + FORMAT(SESSION_START_DATE, 'hh:mm:ss tt') 
FROM EC_USER_SESSION;

这里105对应dd-mm-yyyy的日期格式,再拼接上带AM/PM标识的时间部分,就能得到你想要的样式。

方式2:用FORMAT函数(SQL Server 2012及以上版本可用)

FORMAT函数更直观,直接写你要的格式字符串就行:

SELECT FORMAT(SESSION_START_DATE, 'dd-MM-yyyy hh:mm:ss tt') AS FORMATTED_SESSION_START
FROM EC_USER_SESSION;

不太推荐的方案:把列改成字符串类型

如果你铁了心要把数据以字符串格式存在库里,那可以把SESSION_START_DATE列改成NVARCHAR(20)类型,插入时直接存原字符串:

-- 先修改列类型(前提是表里数据允许这么调整)
ALTER TABLE EC_USER_SESSION ALTER COLUMN SESSION_START_DATE NVARCHAR(20);

-- 插入时直接用原字符串
DECLARE @SESSION_START_TIME NVARCHAR(100) = '18-05-2018 12:12:10 PM';
INSERT INTO EC_USER_SESSION (SESSION_START_DATE) VALUES(@SESSION_START_TIME);

但真心不建议这么做,因为字符串类型的日期没法直接做日期运算(比如比较大小、加减天数),后续维护会很头疼。

内容的提问来源于stack exchange,提问作者Benish Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:25:01