varchar转换为datetime失败。两个结构相似的日期,但只有一个通过

时间:2017-10-26 21:32:15

标签: sql-server date datetime

我将两个日期时间值作为varchars插入。相关列的数据类型为DATETIME两者(与列名称不同,PERFORMANCEDATEDATETIME,因此PERFORMANCETIME)。测试数据是使用工具生成的,因此我无法更改它们,因为它们是数千行。

SET DATEFORMAT ymd
GO

INSERT INTO CONCERT (PERFORMANCEDATE, TOWNNAME, PERFORMANCETIME, LOCATION, TITLE) 
VALUES ('1993-5-2 13:26:22', 'X', '1604-9-13 12:0:48', 'X', 'X')

INSERT INTO CONCERT (PERFORMANCEDATE, TOWNNAME, PERFORMANCETIME, LOCATION, TITLE) 
VALUES ('1102-11-26 9:4:56', 'X', '1534-2-10 11:34:36', 'X', 'X')

第一个插件工作正常,但第二个插件会抛出此错误

  

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

为什么第二个失败?实际上,除了第一个插入之外的每个插入都失败了。

1 个答案:

答案 0 :(得分:1)

SQL Server datetime的最小日期为1753年1月1日。如果您可以将要插入的列更改为datetime2,这将解决您的问题,因为它的最小日期为“0001-01-01”最大值为'9999-12-31'

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime2-transact-sql

另请注意,在引用datetime时,Microsoft甚至建议您应该使用datetime2:

使用time,date,datetime2和datetimeoffset数据类型进行新工作。这些类型与SQL标准一致。它们更便携。 time,datetime2和datetimeoffset提供更多的秒精度。 datetimeoffset为全局部署的应用程序提供时区支持。

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql