我将两个日期时间值作为varchars插入。相关列的数据类型为DATETIME
两者(与列名称不同,PERFORMANCEDATE
为DATETIME
,因此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数据类型转换为日期时间数据类型会导致超出范围的值。
为什么第二个失败?实际上,除了第一个插入之外的每个插入都失败了。
答案 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