Sql server 2012 SQL server 2012:将用于datetime结果的varchar(255)列强制转换为超出范围的值错误

Sql server 2012 SQL server 2012:将用于datetime结果的varchar(255)列强制转换为超出范围的值错误,sql-server-2012,Sql Server 2012,我试图从tbl1中读取类型为varchar(255)的列,并将其作为类型datetime加载到tbl2。请参阅下面的代码 SELECT CAST(LTRIM(RTRIM(NLCompany)) AS varchar(20)) AS SRC_NLCompany, CAST(LTRIM(RTRIM(AccountCode)) AS varchar(8)) AS SRC_AccountCode, CAST(LTRIM(RTRIM(DocumentNumber)) AS numeric(10,

我试图从tbl1中读取类型为varchar(255)的列,并将其作为类型datetime加载到tbl2。请参阅下面的代码

 SELECT CAST(LTRIM(RTRIM(NLCompany)) AS varchar(20)) AS SRC_NLCompany, 
 CAST(LTRIM(RTRIM(AccountCode)) AS varchar(8)) AS SRC_AccountCode, 
 CAST(LTRIM(RTRIM(DocumentNumber)) AS numeric(10, 0)) AS SRC_DocumentNumber, 
 CAST(LTRIM(RTRIM(PaymentType)) AS varchar(1)) AS SRC_PaymentType, 
 CAST(LTRIM(RTRIM(PostingDaybkDate)) AS datetime) AS SRC_PostingDaybkDate
 FROM TBL1

错误:将varchar数据类型转换为datetime数据类型导致值超出范围。

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及更新版本有效

如果您使用SQL Server 2008或更高版本以及
日期
数据类型(仅
日期
-
日期时间
!),那么您确实也可以使用
YYYY-MM-DD
格式,这也适用于SQL Server中的任何设置

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

SQL Server2008及更新版本的建议是,如果只需要日期部分,则使用
DATE
;如果同时需要日期和时间,则使用
DATETIME2(n)
。如果可能的话,您应该尝试逐步淘汰
DATETIME
数据类型