更新 SQL 并将 nvarchar 字符串转换为 dateTime
Update SQL and converting nvarchar string to dateTime
我将数据从 CSV 插入 SQL 服务器。
tableTbl_art_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
我要更新另一个 table Tbl_art
, table:
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];
数量的更新是正确的,不是日期时间转换
Msg 241, Level 16, State 1, Line 3
Conversion failed when converting date and/or time from character string.
感谢您的帮助
试试 CONVERT(DATETIME,atemp.[importedDate ],102)
顺便说一句:columnName "importedDate" 后面真的有一个 space 吗?
您 运行 遇到的问题可能与文化/语言有关。
你可能会读到这个
Convert
允许您指定专用格式。 cast
只会尝试使用您的默认值
因为Marc_s已经回答here
SQL 服务器支持多种格式 - 请参阅 MSDN Books Online on CAST and CONVERT。大多数这些格式依赖于您的设置 - 因此,这些设置有时可能有效 - 有时无效。
解决这个问题的方法是使用 SQL 服务器支持的(稍微改编的)ISO-8601 日期格式 - 这种格式有效 总是 - 无论您的 SQL 服务器语言和日期格式设置如何。
ISO-8601 format 受 SQL 支持 服务器有两种形式:
YYYYMMDD
仅用于日期(无时间部分);此处注意:没有破折号!,这一点非常重要! YYYY-MM-DD
NOT 独立于 SQL 服务器中的日期格式设置,并且 NOT 在所有情况下都有效!
或:
YYYY-MM-DDTHH:MM:SS
用于日期和时间 - 请注意:此格式 有 破折号(但它们 可以 被省略),和一个固定的 T
作为 DATETIME
. 的日期和时间部分之间的分隔符
这对 SQL Server 2000 及更新版本有效。
因此在您的具体情况下 - 使用这些字符串:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
你应该没问题(注意:你需要使用国际 24 小时 格式而不是 12 小时 AM/PM 格式)。
或者:如果您使用的是 SQL 服务器 2008 或更新版本,您也可以使用 DATETIME2
数据类型(而不是普通的 DATETIME
)和您当前的 INSERT
可以毫无问题地工作! :-) DATETIME2
好多了,对转换的挑剔也少了很多 - 无论如何,它是 SQL Server 2008 或更新版本的推荐 date/time 数据类型。
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 服务器以及 SQL 服务器中的任何语言和日期格式设置都应该没问题。
我好像是csv文件出错了...
它在日期后包含一个 space
我使用 SSIS 包来安排导入,他毫无问题地处理了转换
谢谢
我将数据从 CSV 插入 SQL 服务器。
tableTbl_art_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
我要更新另一个 table Tbl_art
, table:
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];
数量的更新是正确的,不是日期时间转换
Msg 241, Level 16, State 1, Line 3
Conversion failed when converting date and/or time from character string.
感谢您的帮助
试试 CONVERT(DATETIME,atemp.[importedDate ],102)
顺便说一句:columnName "importedDate" 后面真的有一个 space 吗?
您 运行 遇到的问题可能与文化/语言有关。
你可能会读到这个
Convert
允许您指定专用格式。 cast
只会尝试使用您的默认值
因为Marc_s已经回答here
SQL 服务器支持多种格式 - 请参阅 MSDN Books Online on CAST and CONVERT。大多数这些格式依赖于您的设置 - 因此,这些设置有时可能有效 - 有时无效。
解决这个问题的方法是使用 SQL 服务器支持的(稍微改编的)ISO-8601 日期格式 - 这种格式有效 总是 - 无论您的 SQL 服务器语言和日期格式设置如何。
ISO-8601 format 受 SQL 支持 服务器有两种形式:
YYYYMMDD
仅用于日期(无时间部分);此处注意:没有破折号!,这一点非常重要!YYYY-MM-DD
NOT 独立于 SQL 服务器中的日期格式设置,并且 NOT 在所有情况下都有效!
或:
YYYY-MM-DDTHH:MM:SS
用于日期和时间 - 请注意:此格式 有 破折号(但它们 可以 被省略),和一个固定的T
作为DATETIME
. 的日期和时间部分之间的分隔符
这对 SQL Server 2000 及更新版本有效。
因此在您的具体情况下 - 使用这些字符串:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
你应该没问题(注意:你需要使用国际 24 小时 格式而不是 12 小时 AM/PM 格式)。
或者:如果您使用的是 SQL 服务器 2008 或更新版本,您也可以使用 DATETIME2
数据类型(而不是普通的 DATETIME
)和您当前的 INSERT
可以毫无问题地工作! :-) DATETIME2
好多了,对转换的挑剔也少了很多 - 无论如何,它是 SQL Server 2008 或更新版本的推荐 date/time 数据类型。
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 服务器以及 SQL 服务器中的任何语言和日期格式设置都应该没问题。
我好像是csv文件出错了... 它在日期后包含一个 space 我使用 SSIS 包来安排导入,他毫无问题地处理了转换 谢谢