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

Sql 将VARCHAR转换为SMALLDATETIME作为UPDATE语句的一部分,sql,sql-server,sql-server-2008,sql-server-2008-r2,data-import,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,Data Import,我正在CSV文件上执行批量数据导入。在CSV文件中,我的“日期”列包含格式为“yyyyddmmhmm”的日期(例如200603010929) 目前,如果在创建表时选择“smalldatetime”,数据导入将失败,并出现以下错误: 大容量加载数据转换错误(类型不匹配或无效字符 对于第2行第2列(日期)的指定代码页) 据我所知,要让它工作,日期必须是某种格式才能工作 因此,我的一个想法是将日期值导入VARCHAR类型的字段,然后在导入完成后,我希望对每一行执行更新,以将日期转换为smalldate

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

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

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

据我所知,要让它工作,日期必须是某种格式才能工作

因此,我的一个想法是将日期值导入VARCHAR类型的字段,然后在导入完成后,我希望对每一行执行更新,以将日期转换为smalldatetime。这将延长导入过程,但我认为这将比尝试查找并替换CSV数据(这是一个庞大的数据集)容易得多,也快得多

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

这就是我到目前为止所做的:

UPDATE NYSE
SET [date]=CONVERT(smalldatetime, [date])
此操作失败,因为文本格式不正确。是否可以在CONVERT函数中指定字符串的格式,或者是否有其他方法

我感谢所有评论。谢谢

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;

它真的是YYYYDDMM而不是YYYYMMDD吗?那么20060301是1月3日,而不是3月1日?是否确实正确导入了没有时间的YYYYDDMM?这些可能是交换D和M值…所以你不在乎数据是否准确?用户输入了3月1日,但您将其解释为1月3日,可以吗?我很困惑。你在那页上看到了YYYY-DD-MM吗?我建议告诉任何向你提供这些数据的人不要再愚蠢了,提供一个有效的格式。或者在添加SQL Server复杂性之前,使用非常简单的命令行程序对文件进行预处理。谢谢您的回答。如果你有机会,你能编辑一下答案,看看发生了什么吗?这将帮助我理解它,并检查它是否适用于我的场景。它基本上只是将无效字符串的片段分离,形成一个有效字符串。从第二行开始计算,先是前4个字符(2006),然后是第7和第8个字符(01),然后是第5和第6个字符(01)。这形成了YYYYMMDD格式的有效且明确的日期。然后在第3行中,我们添加一个空格,并在最后4个字符(0929)中插入冒号,使其成为有效时间(09:29),并形成一个完整的字符串20060103 09:29。我们可以将该字符串转换为smalldatetime,但为了以这种方式存储该字符串,我们还需要一种样式。我按照您提供的方式运行了Update语句,但出现了一个错误,“字符串或二进制数据将被截断”。我的varchar当前有15个字符的限制。我将CHAR(16)参数更改为CHAR(15)——这样会抛出错误,“将varchar数据类型转换为smalldatetime数据类型导致值超出范围。”。这一次,它运行的时间更长。在运行此操作之前,我是否需要提高varchar的限制?是的,您会注意到我使用varchar(20)进行填充。您现在遇到的错误是,您至少有一个日期的格式与您描述的格式不符。尝试
选择。。。来自dbo.table,其中ISDATE(左([date],4)+子字符串([date],7,2)+子字符串([date],5,2)+‘+STUFF(右([date],4),3,0’:’)=0我想你错过了我说你有一些我的答案无法修复的无效数据的部分,你必须使用我在评论中发布的选择来识别它并修复它。。。