Nvarchar数据类型到datetime

时间:2015-03-08 23:02:53

标签: sql sql-server-2012

INSERT INTO [std_Receipt]
           ([rcp_GUID]
           ,[rcp_Date]
           ,[rcp_Check_No]
           ,[rcp_Amount]
           --,[rcp_InterestRate]
           ,[rcp_Purpose]
           ,[rcp_Deposited]
           ,[rcp_Statement]
           ,[rcp_Note]
           ,[rcp_State]
           ,[rcp_Reconciled]
           ,[rcp_ForceItemize]
           ,[rcp_ForceUnitemize]
           ,[rcp_per_GUID]
           ,[rcp_rcs_GUID]
           ,[rcp_sou_GUID]
           ,[rcp_chs_GUID]
           ,[rcp_acc_GUID]
           ,[rcp_bat_GUID]
           ,[rcp_FecId]
           ,[rcp_TransId]
           --,[rcp_rlv_GUID]
           --,[rcp_let_GUID_ThankYou]
           --,[rcp_let_GUID_Compliance]
           --,[rcp_ple_GUID]
           --,[rcp_link_GUID]
           ,[rcp_Deleted]
           ,[rcp_CreatedOn]
           ,[rcp_CreatedBy]
           --,[rcp_UpdatedOn]
           --,[rcp_UpdatedBy]
           --,[rcp_DeletedOn]
           --,[rcp_DeletedBy]
           ,[rcp_Support]
           ,[rcp_Oppose]
           ,[rcp_SourceId]
           --,[rcp_DueDate]
           --,[rcp_MatchingFundsSequence]
           --,[rcp_receivedDate]
           ,[rcp_ReceivedYear]
           --,[rcp_TransferAmount]
           --,[rcp_YearPart]
           --,[rcp_AmendmentCode]
           ,[rcp_Locked]
           --,[rcp_LockedOn]
           --,[rcp_FillingId]
           --,[rcp_FillingDate]
           --,[rcp_pmt_GUID]
           --,[rcp_IsValid]
           --,[rcp_ReceivedBy_GUID]
           --,[rcp_ReceiptableAmount]
           --,[rcp_isNonReceiptable]
           --,[rcp_ReceiptSentDate]
           )
     select
           rcpguid,--(<rcp_GUID, uniqueidentifier,>
           date,--,<rcp_Date, datetime,>
           isnull(check_no,''),--,<rcp_Check_No, nvarchar(50),>
           amount,--,<rcp_Amount, money,>
           --,<rcp_InterestRate, decimal(9,6),>
           isnull(note,''),--,<rcp_Purpose, nvarchar(250),>
           deposited,--,<rcp_Deposited, datetime,>
           deposited,--,<rcp_Statement, datetime,>
           '',--,<rcp_Note, ntext,>
           '',--,<rcp_State, nchar(2),>
           0,--,<rcp_Reconciled, bit,>
           0,--,<rcp_ForceItemize, bit,>
           CASE WHEN [type] = 'Unitemized' THEN 1 ELSE 0 END,--,<rcp_ForceUnitemize, bit,>
           perguid,--,<rcp_per_GUID, uniqueidentifier,>
           rcsguid,--,<rcp_rcs_GUID, uniqueidentifier,>
           souguid,--,<rcp_sou_GUID, uniqueidentifier,>
           chsguid,--,<rcp_chs_GUID, uniqueidentifier,>
           accguid,--,<rcp_acc_GUID, uniqueidentifier,>
           batguid,--,<rcp_bat_GUID, uniqueidentifier,>
           '',--,<rcp_FecId, nvarchar(20),>
           '',--,<rcp_TransId, nvarchar(20),>
           --,<rcp_rlv_GUID, uniqueidentifier,>
           --,<rcp_let_GUID_ThankYou, uniqueidentifier,>
           --,<rcp_let_GUID_Compliance, uniqueidentifier,>
           --,<rcp_ple_GUID, uniqueidentifier,>
           --,<rcp_link_GUID, uniqueidentifier,>
           0,--,<rcp_Deleted, bit,>
           getdate(),--,<rcp_CreatedOn, datetime,>
           '00000000-0000-0000-0000-000000000000',--,<rcp_CreatedBy, uniqueidentifier,>
           --,<rcp_UpdatedOn, datetime,>
           --,<rcp_UpdatedBy, uniqueidentifier,>
           --,<rcp_DeletedOn, datetime,>
           --,<rcp_DeletedBy, uniqueidentifier,>
           0,--,<rcp_Support, bit,>
           0,--,<rcp_Oppose, bit,>
           'CM:'+cast(keyid as nvarchar),--,<rcp_SourceId, nvarchar(10),>
           --,<rcp_DueDate, datetime,>
           --,<rcp_MatchingFundsSequence, bigint,>
           --,<rcp_receivedDate, datetime,>
           year(date),--,<rcp_ReceivedYear, varchar(4),>
           --,<rcp_TransferAmount, money,>
           --,<rcp_YearPart, int,>
           --,<rcp_AmendmentCode, nvarchar(3),>
           0--,<rcp_Locked, bit,>
           --,<rcp_LockedOn, datetime,>
           --,<rcp_FillingId, nvarchar(30),>
           --,<rcp_FillingDate, datetime,>
           --,<rcp_pmt_GUID, uniqueidentifier,>
           --,<rcp_IsValid, bit,>
           --,<rcp_ReceivedBy_GUID, uniqueidentifier,>
           --,<rcp_ReceiptableAmount, money,>
           --,<rcp_isNonReceiptable, bit,>
           --,<rcp_ReceiptSentDate, datetime,>)
   from i_contfile

好的我收到了错误:

  

将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值。

但非常简单的设置我正在插入我的收据而不确定如何解决这个问题..

1 个答案:

答案 0 :(得分:0)

乍一看,导致错误的最可能原因是i_contfile.date列中的错误数据。另一个日期由GETDATE()填写,应该没问题。

i_contfile.date列的架构是什么?它是NVARCHAR列吗?

查找具有问题的确切行的一种方法是进行二分查找。使用BEGIN TRAN / ROLLBACK插入行的前半部分。如果成功,请尝试下半场。继续缩小行,直到找到导致问题的行。

是否可以执行SELECT * FROM i_contfile并将结果包含在您的答案中?

我发现这种情况的另一种方式是SELECT中的列与INSERT中的列顺序不匹配。在这种情况下,这看起来不是原因。

如果缺少逗号,则会变得非常棘手,因为SQL Server会将下一列视为前一列的列别名。例如,下面的SELECT似乎有4列,但实际上只有3列。如果没有逗号,SELECT会将ColB重命名为ColC。对于巨大的INSERT查询,这是一个容易犯的错误:

INSERT INTO Dest
(
    Col1,
    Col2,
    Col3
)
SELECT
    ColA,
    ColB  -- missing comma!
    ColC, -- this is now the alias of ColB
    ColD
FROM Source

- 更新 -

您说输入列是NVARCHAR列。您可以使用ISDATE function

检查日期字符串的有效性
INSERT INTO std_Receipt
(...rcp_Date...)
SELECT...
    CASE WHEN ISDATE(date) = 0 THEN NULL
         ELSE date
    END,
...

使用这种技术可以很快在i_contfile表中找到错误的日期数据:

SELECT *
FROM i_contfile
WHERE ISDATE(date) = 0

如果源日期数据有一些自定义格式,我们应该能够在看到格式后找出如何处理数据。