将 VARCHAR 转换为 SMALLDATETIME 作为 UPDATE 语句的一部分

问题描述 投票:0回答:2

我正在对 CSV 文件执行批量数据导入。在 CSV 文件中,我的“日期”列包含格式为“YYYYDDMMHHMM”的日期(例如 200603010929)。

目前,如果我在创建表时选择“smalldatetime”,数据导入将失败并出现以下错误:

批量加载数据转换错误(类型不匹配或无效字符 对于指定的代码页)第 2 行第 2 列(日期)。

据我了解,要使其发挥作用,日期必须采用某种格式才能发挥作用。

因此,我的一个想法是将日期值导入到 VARCHAR 类型的字段中,然后当导入完成后,我想对每一行执行 UPDATE 以将日期转换为小日期时间。这会延长导入过程,但我认为这比尝试对 CSV 数据(这是一个巨大的数据集)进行查找和替换要容易得多,速度也快得多。

所以,我的问题是: 1)这可能吗? 2)我该如何实施?

这是我到目前为止所拥有的:

UPDATE NYSE
SET [date]=CONVERT(smalldatetime, [date])

由于文本格式不正确,因此失败。是否可以在 CONVERT 函数中指定字符串的格式,或者还有其他方法吗?

我感谢所有评论。谢谢。

sql sql-server sql-server-2008 sql-server-2008-r2 data-import
2个回答
3
投票
DECLARE @s TABLE([date] VARCHAR(20));

INSERT @s SELECT '200603010929';

UPDATE @s SET [date] = CONVERT(CHAR(16), CONVERT(SMALLDATETIME, 
  LEFT([date],4) + SUBSTRING([date],7,2) + SUBSTRING([date],5,2) 
  + ' ' + STUFF(RIGHT([date],4),3,0,':')), 120);

SELECT [date], CONVERT(SMALLDATETIME, [date]) FROM @s;

如果实际上是YYYYMMDD,那么就稍微简单一些:

DECLARE @s TABLE([date] VARCHAR(20));

INSERT @s SELECT '200603010929';

UPDATE @s SET [date] = CONVERT(CHAR(16), CONVERT(SMALLDATETIME, 
  LEFT([date],8) + ' ' + STUFF(RIGHT([date],4),3,0,':')), 120);

SELECT [date], CONVERT(SMALLDATETIME, [date]) FROM @s;

0
投票

使用

DATEFROMPARTS(year, month, day)
年月日均为整数。

© www.soinside.com 2019 - 2024. All rights reserved.