将结果集插入临时表时,将nvarchar转换为SQL Server中的Date会失败

时间:2016-07-14 18:09:27

标签: sql sql-server

我一直在努力解决为什么我的插件失败了。我有一张桌子,每张记录都有几个日期。数据最初插入到所有NVARCHAR的“登陆”表中。在我的Merge Upsert语句中,我将这些NVARCHARS转换为Dates,并产生我期望的格式并且格式正常。尝试将转换后的日期插入到临时表中时,此结果集失败,其中日期字段的数据类型为DATES。

登陆表

CREATE TABLE [land].[MARA] (
[MATNR] nvarchar(18) NULL,
[ERSDA] nvarchar(12) NULL,
[LAEDA] nvarchar(12) NULL
ON [PRIMARY]
WITH (DATA_COMPRESSION = NONE);
GO
ALTER TABLE [land].[MARA] SET (LOCK_ESCALATION = TABLE);
GO

这是数据在着陆中的存储方式

matnr   ersda   laeda
841058  01.12.1998  23.06.2016
841630  01.12.1998  23.06.2016
842058  01.12.1998  01.06.2016
842085  08.12.1998  23.06.2016
842086  01.12.1998  23.06.2016

临时表

CREATE TABLE [stage].[MARA] (
[MATNR] nvarchar(18) NULL,
[ERSDA] date NULL,
[LAEDA] date NULL
ON [PRIMARY]
WITH (DATA_COMPRESSION = NONE);
GO
ALTER TABLE [stage].[MARA] SET (LOCK_ESCALATION = TABLE);
GO

选择陈述

SELECT MATNR
  ,REPLACE(CONVERT(NVARCHAR, ERSDA,101), '.', '/') AS ERSDA
  ,REPLACE(CONVERT(NVARCHAR, LAEDA,101), '.', '/') AS LAEDA
FROM IBSCM01.land.MARA

执行上述SQL Select会生成格式化日期的结果集

MATNR   ERSDA   LAEDA
841058  01/12/1998  23/06/2016
841630  01/12/1998  23/06/2016
842058  01/12/1998  01/06/2016
842085  08/12/1998  23/06/2016

添加Insert子句会产生转换错误

INSERT INTO stage.mara
SELECT MATNR
  ,REPLACE(CONVERT(NVARCHAR, ERSDA,101), '.', '/') AS ERSDA
  ,REPLACE(CONVERT(NVARCHAR, LAEDA,101), '.', '/') AS LAEDA
FROM IBSCM01.land.MARA

Conversion failed when converting date and/or time from character string.

执行此选择尝试转换为日期的位置也会引发相同的错误。

SELECT MATNR
  ,REPLACE(CONVERT(DATE, ERSDA,101), '.', '/') AS ERSDA
  ,REPLACE(CONVERT(DATE, LAEDA,101), '.', '/') AS LAEDA
FROM IBSCM01.land.MARA

我需要的是将NVARCHAR日期字段转换为已插入阶段表并且日期正确的日期。 非常感谢任何见解。 专利

1 个答案:

答案 0 :(得分:1)

您应该使用format convert 105,因为dateformat是dd.mm.yyyy

SELECT MATNR
,CONVERT(DATE, ERSDA,105) AS ERSDA
,CONVERT(DATE, LAEDA,105) AS LAEDA
FROM IBSCM01.land.MARA

上面的查询结果可以直接插入到临时表中,因为ERSDA和LAEDA的数据类型为DATE