Sql server 更新SQL并将nvarchar字符串转换为dateTime

Sql server 更新SQL并将nvarchar字符串转换为dateTime,sql-server,csv,datetime,nvarchar,import-from-csv,Sql Server,Csv,Datetime,Nvarchar,Import From Csv,我将CSV中的数据插入SQL Server 表Tbl\u art\u tmp为: Art nchvar(50) Qty nvarchar(50) importedDate nvarchar(50) 要插入的SQL查询 BULK INSERT Tbl_Art_tmp FROM 'ExportArt.CSV' WITH (FIRSTROW = 1, FIELDTERMINATOR = ';', ROWTERMINATOR='0x0a'); 从另一个软件

我将CSV中的数据插入SQL Server

Tbl\u art\u tmp
为:

Art nchvar(50)  
Qty nvarchar(50)
importedDate nvarchar(50)
要插入的SQL查询

BULK INSERT Tbl_Art_tmp 
FROM 'ExportArt.CSV' 
WITH 
    (FIRSTROW = 1,  
     FIELDTERMINATOR = ';', 
     ROWTERMINATOR='0x0a');
从另一个软件导出的csv包含

Art;Qty;importedDate
10203R04-04; 0;2015-10-21
10407T-10-100; 9;2016-02-01
我想更新另一个表
Tbl\u art
,该表:

art nvarchar(30)
Qty real
lastUpdate datetime
我的SQL查询:

UPDATE a
SET a.[qty] = CAST(atemp.[Qty] AS REAL),
    a.[lastUpdate] = CAST(atemp.[importedDate] AS DATETIME)
FROM [Tbl_Art] a
JOIN [Tbl_art_tmp] atemp ON a.[art] = atemp.[Art];
数量的更新是确定的,而不是日期时间转换

味精241,第16级,状态1,第3行
从字符串转换日期和/或时间时,转换失败

感谢您的帮助

尝试使用
CONVERT(DATETIME,atemp.[importedDate],102)

顺便问一下:“importedDate”列名后面真的有空格吗

您遇到的问题可能与文化/语言有关

你可以看看这个


Convert
允许您指定专用格式。
cast
将尝试使用您的默认值,因为Marc_s已经回答了

SQL Server支持多种格式-请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效

解决此问题的方法是使用SQL Server支持的(稍作调整的)ISO-8601日期格式,无论您的SQL Server语言和日期格式设置如何,此格式始终有效

SQL Server支持的有两种风格:

  • YYYYMMDD
    仅适用于日期(无时间段);注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • 日期和时间的
    YYYY-MM-DDTHH:MM:SS
    -此处注意:此格式有破折号(但可以省略),并且在
    DATETIME
    的日期和时间部分之间有一个固定的
    T
    分隔符
这对SQL Server 2000及更新版本有效

因此,在您的具体案例中,请使用以下字符串:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
你应该很好(注意:你需要使用国际24小时格式,而不是12小时AM/PM格式)

或者:如果您使用的是SQL Server2008或更高版本,您还可以使用
DATETIME2
数据类型(而不是普通的
DATETIME
),您当前的
INSERT
将不会出现任何问题!:-)
DATETIME2
在转换方面更好,也不太挑剔,而且它还是SQL Server 2008或更高版本的推荐日期/时间数据类型

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

不要问我为什么这个话题如此棘手,有些令人困惑——事实就是这样。但是使用
YYYYMMDD
格式,您应该可以使用任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置。

我似乎是csv文件出错了。。。 它包含日期后的空格 我使用SSIS包安排导入,他负责转换,没有任何问题
谢谢

如果您只对日期感兴趣(没有时间部分),我建议在
tbl\u Art
中使用
date
作为您的数据类型(而不是
datetime
)。使用
DATE
可以修复此错误,
importedDate
字段真正包含什么?是否有任何尾随字符、垃圾等?顺便说一句,您可以对暂存表本身使用
日期
日期时间
。只要日期格式明确,如未分离的
yyyyymmdd
或ISO 8601,就会自动进行转换。否则,将应用列的排序规则。即使是格式文件也可以更改。您确定这不是由脏数据引起的吗?我不能将其更改为日期,因为稍后客户端将使用时间
cast('2016-02-05'作为日期)
cast('2016-02-05'作为日期时间)
应在不指定格式的情况下工作。CAST可以识别ISO 8601或未分离的格式。@PanagiotisKanavos,你说得对。。。谢谢你指出这一点。。。我刚刚用“完整的”ISO8601(用“T00:11:30”)检查了它。即使没有“T”,也能正确识别。从未完成学习…据我所知,OP正在导入一个CSV文件,因此别无选择,只能从那里获取日期…我将lastUpdate的类型更改为datetime2,但仍然无法处理此查询给我相同的错误:
SELECT CAST(importedDate As date)from Tbl_Art_tmp
从Tbl\U Art\U tmp中选择CAST(导入日期作为日期时间)
从Tbl_Art_tmp中选择CAST(导入日期为DATETIME2)
从字符串转换日期和/或时间时,仍然是Msg 241,级别16,状态1,第2行转换失败。我正在使用sql server 2008Hi,我又想到了一个主意。在我的回答中,我已经指出了额外的空间。。。您知道吗,塔尔windows标准换行符使用两个字符(13和11,即CR和LF)?您只指定了LF。也许,“空间”实际上是一个CR。。。