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

Sql 将varchar数据类型转换为datetime数据类型导致值超出范围。错误,sql,sql-server,tsql,datetime,Sql,Sql Server,Tsql,Datetime,我使用以下内容创建临时表: CREATE TABLE #temp_conv_data ( company_code VARCHAR(4), source_currency VARCHAR(3), effective_date DATETIME, conversion_factor NVARCHAR(20), create_time DATETIME, revision_time DATETIME, from_web_servi

我使用以下内容创建临时表:

CREATE TABLE #temp_conv_data 
(
    company_code VARCHAR(4),  
    source_currency VARCHAR(3), 
    effective_date DATETIME, 
    conversion_factor NVARCHAR(20), 
    create_time DATETIME, 
    revision_time DATETIME,
    from_web_services BIT
)
然后,我尝试用下面的insert语句填充它,并得到错误:

INSERT INTO #temp_conv_data (company_code, source_currency, effective_date, conversion_factor, create_time, revision_time, from_web_services) 
VALUES ('FGLS', 'ADP', '2021-01-20 18:00:00',  0.00729, '2020-17-08 02:15:53', '2020-17-08 02:15:53', 0)
我尝试对日期值使用
CAST('2021-01-20 18:00:00'作为日期时间)
CONVERT('2021-01-20 18:00:00',126)
,得到了相同的错误:

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


在SQL Server中插入日期和时间值时,应始终以区域无关的格式编写日期字符串

INSERT INTO #temp_conv_data (company_code, source_currency, effective_date, conversion_factor, create_time, revision_time, from_web_services) 
VALUES ('FGLS', 'ADP', '20210120 18:00:00',  0.00729, '20200817 02:15:53', '20200817 02:15:53', 0)
请注意,完全没有斜线和破折号。除了使用完整的ISO8601T格式外,这是唯一一种在所有SQL Server日期和时间相关类型上可靠工作的格式,无需担心区域设置。如果你使用这种格式,它必须是整个格式,包括T。但是我上面建议的格式是最简单的


请注意,正如Nick所提到的,您还在不同的常量中以不同的顺序使用月/日。无论区域设置如何,这都是行不通的。

您必须使用
yyyy-mm-dd
您正在使用的
2020-17-08
(yyyy-dd-mm)。

为什么要使用两种不同的日期格式?一种是YMD,另两种是YDM。请坚持使用ISO格式(YMD)。您的后两个日期应更改为YM,并使用
datetime2
,因为现在建议使用该日期时间类型。