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
相关产品推荐
相关产品推荐

