如何在SQL Server中从字符串列提取日期并导入两个datetime列
SQL Server 提取日期字段解决方案
针对你的需求,可通过组合字符串函数提取日期部分并转换为datetime类型,完整实现代码如下:
INSERT INTO #tdt (ID, Descr, Prevdate, Postdate) SELECT ID, LTRIM(LEFT(Descr, CHARINDEX('-', Descr) - 1)) AS Descr, -- 提取起始日期并转换为datetime CONVERT(datetime, SUBSTRING(Descr, CHARINDEX('-', Descr) + 2, CHARINDEX(' to ', Descr) - CHARINDEX('-', Descr) - 2)) AS Prevdate, -- 提取结束日期并转换为datetime CONVERT(datetime, SUBSTRING(Descr, CHARINDEX(' to ', Descr) + 4, LEN(Descr) - CHARINDEX(' to ', Descr) - 3)) AS Postdate FROM #src; -- 查询目标表验证结果 SELECT * FROM #tdt;
逻辑拆解
- Descr字段处理:在你原有提取逻辑基础上添加
LTRIM(),移除字段前的多余空格(如第一条数据-前的空格)。 - Prevdate提取:
- 通过
CHARINDEX('-', Descr) + 2定位到-后的日期起始位置 - 利用
CHARINDEX(' to ', Descr)获取分隔符位置,计算出日期字符串长度后用SUBSTRING截取 - 用
CONVERT(datetime, ...)将截取的字符串转为日期类型
- 通过
- Postdate提取:
- 通过
CHARINDEX(' to ', Descr) + 4定位到to后的日期起始位置 - 结合
LEN(Descr)计算剩余字符串长度,用SUBSTRING截取结束日期 - 同样转换为
datetime类型
- 通过
异常处理提示
若源表存在Descr不包含-或to的异常数据,建议添加WHERE条件过滤(如WHERE CHARINDEX('-', Descr) > 0 AND CHARINDEX(' to ', Descr) > 0),避免因字符串截取失败导致报错。
内容的提问来源于stack exchange,提问作者Mr D
相关产品推荐
相关产品推荐

