在 SQL Server 中,存在隐式转换数据类型的规则。
在此文档页面有一个关于可以进行哪些转换的表格。
在此文档页面我们可以看到什么可以转换为什么。
当我将整数隐式转换为日期时间时,隐式假定的间隔为 1 天。因此,明天同一时间返回以下内容:
Select getdate() + 1
但是,有人可能会认为 1 应该是一小时或一分钟。我试图在文档中找到指定隐式转换为日期时间的间隔始终为 24 小时的位置。在日期时间的文档的开头,它说:
定义与一天中的时间和小数部分组合的日期 基于 24 小时制的秒数。但我觉得这不够精确和清晰,不足以让某人相信如果隐式转换,整数 1 将不变地代表 1 天。
那么微软有没有一个地方明确说明这一点?
1
作为一天,我不知道。也许是因为当时另一个应用程序做了类似的事情(例如,Excel 也做了同样的事情,但它们的数字不一致)。如果不是因为其他应用程序,它可能是任意的。就像您在评论中提到的那样,像
GETDATE() + 1
这样的代码很容易被视为不明确;
1
作为
datetime
是什么,用户很容易会因为期望它是其他东西而被原谅(例如像纪元那样的第二个)。现代日期和时间数据类型
date
、
datetime2
和
datetimeoffset
(以及
time
)中不存在此行为。数据类型不允许从数值到它们的显式或隐式转换。如果您尝试将
1
添加到这样的日期,您会收到错误:
SELECT SYSDATETIME() + 1;
操作数类型冲突:datetime2 与 int 不兼容事实上,最好的办法就是明确表达。有一个用于在日期(和时间)值中添加/减去时间段的函数:
DATEADD
。该函数适用于所有日期和时间数据类型(“新”和“旧”),并且语法非常显式:
SELECT DATEADD(DAY, 1, SYSDATETIME());
现在,没有人会认为上述内容是在系统日期和时间的当前值上添加除 1 天以外的任何内容。