我一直在努力解决为什么我的插件失败了。我有一张桌子,每张记录都有几个日期。数据最初插入到所有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日期字段转换为已插入阶段表并且日期正确的日期。 非常感谢任何见解。 专利
答案 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
。