SQL中varchar字符串转换为datetime无法获取时间部分如何解决
问题根因
代码无法获取时间部分的核心原因是CAST(@col AS varchar(8))会将14位长度的输入字符串截断为前8位,仅保留20220602的日期片段,后6位代表时分秒的235900被直接丢弃,因此转换后时间部分默认显示为00:00:00.000。
修复方案
输入字符串是紧凑格式的yyyyMMddHHmmss(4位年+2位月+2位日+2位时+2位分+2位秒),不需要做截断处理,将字符串整理为数据库可识别的日期时间格式后再转换即可,以下提供两种常用写法:
- 全版本兼容写法:通过
STUFF函数插入时间分隔符,再用121样式转换
declare @col varchar(14) = '20220602235900'; select CONVERT(datetime, STUFF(STUFF(STUFF(@col,9,0,' '),12,0,':'),15,0,':'), 121 ) dtimecre
运行后返回结果为2022-06-02 23:59:00.000,包含完整的日期与时间信息。
- SQL Server 2012及以上版本可用写法:通过
DATETIMEFROMPARTS函数按位截取时间各部分生成日期类型,逻辑更直观
declare @col varchar(14) = '20220602235900'; select DATETIMEFROMPARTS( SUBSTRING(@col,1,4), -- 年 SUBSTRING(@col,5,2), -- 月 SUBSTRING(@col,7,2), -- 日 SUBSTRING(@col,9,2), -- 时 SUBSTRING(@col,11,2), -- 分 SUBSTRING(@col,13,2), -- 秒 0 -- 毫秒 ) dtimecre
不要随意对原始日期字符串做定长截断,除非你明确确认截断位置不会丢失需要的时间片段。
内容的提问来源于stack exchange,提问作者user1704203
相关产品推荐
相关产品推荐

