DATE与DATETIME在SQL SERVER 2008 R2中转换无效日期

Ahm*_*gab 5 sql datetime date sql-server-2008-r2

因此,虽然我认识到日期格式化等应该在表示层中完成,但我很想知道是否有人已经看到或认识到这种差异(请在家尝试,如果这样倾向)我有点困惑,多数好奇,首先是示例代码.

更新:为了澄清基于初始响应,我知道日期无效或更好"不安全",因为我更普遍关注的特定字段来自用户输入."也就是说,虽然我知道验证/格式化不是SQL 2008强大的套装,至少我很好奇DATETIME更宽容,我想知道如何宽容."

DECLARE @RawValue NVARCHAR(30), @Value DATETIME;
SET @RawValue = '01/20.1901'

SET @Value = CAST(@RawValue AS DATETIME)
PRINT @Value
Run Code Online (Sandbox Code Playgroud)

这会为我的服务器设置生成正确的结果:Jan 20 1901 12:00 AM

但是,如果倒数第二行更改为(用DATE替换DATETIME):

  SET @Value = CAST(@RawValue AS DATE)
Run Code Online (Sandbox Code Playgroud)

消息241,级别16,状态1,行8转换在从字符串转换日期和/或时间时失败.

那里有解释吗?要明确的是,如果我将@Value作为DATE或DATETIME或甚至是NVARCHAR,那么无关紧要 - 相同的结果.错误消息似乎表明它在转换日期和/或时间时遇到问题,为什么DATETIME的行为会有所不同?

谢谢,

小智 5

值得一提的是,DATE和DATETIME是完全不同的数据类型.DATE不是简单的DATETIME,删除时间.例如,CAST('17520910'AS DATE)可以工作,而类似的转换为DATETIME则不然.对于历史爱好者来说,在英格兰或她的殖民地没有这样的日子,日历从9月2日到9月14日跳过.与DATETIME不同,DATE可以追溯到第1年而不考虑日历系统.

另一个重要的区别是缺少隐式类型转换以直接向日期添加若干天.如果D是日期时间,则D + 3是三天的日期.如果D是DATE,则D + 3产生错误.

我假设因为隐式转换的新代码是从头开始为DATE创建的,微软只是让它更加挑剔.