Int 1 总是隐式转换为 1 天吗?

问题描述 投票:0回答:1

在 SQL Server 中,存在隐式转换数据类型的规则。

此文档页面有一个关于可以进行哪些转换的表格。

在此文档页面我们可以看到什么可以转换为什么。

当我将整数隐式转换为日期时间时,隐式假定的间隔为 1 天。因此,明天同一时间返回以下内容:

Select getdate() + 1
但是,有人可能会认为 1 应该是一小时或一分钟。我试图在文档中找到指定隐式转换为日期时间的间隔始终为 24 小时的位置。在日期时间的

文档的开头,它说:

定义与一天中的时间和小数部分组合的日期 基于 24 小时制的秒数。

但我觉得这不够精确和清晰,不足以让某人相信如果隐式转换,整数 1 将不变地代表 1 天。

那么微软有没有一个地方明确说明这一点?

sql-server t-sql types implicit-conversion
1个回答
0
投票
这很可能更多是早于 SQL Server 的东西,并且可能来自 Sybase(尽管我无法确认这一点)。为什么选择

1

作为一天,我不知道。也许是因为当时另一个应用程序做了类似的事情(例如,Excel 也做了同样的事情,但它们的数字不一致)。如果不是因为其他应用程序,它可能是任意的。

就像您在评论中提到的那样,像

GETDATE() + 1

 这样的代码很容易被视为不明确; 
1
 作为 
datetime
 是什么,用户很容易会因为期望它是其他东西而被原谅(例如像纪元那样的第二个)。

现代日期和时间数据类型

date

datetime2
datetimeoffset
(以及 
time
)中不存在此行为。数据类型不允许从数值到它们的显式或隐式转换。如果您尝试将 
1
 添加到这样的日期,您会收到错误:

SELECT SYSDATETIME() + 1;

操作数类型冲突:datetime2 与 int 不兼容

事实上,最好的办法就是明确表达。有一个用于在日期(和时间)值中添加/减去时间段的函数:

DATEADD

。该函数适用于所有日期和时间数据类型(“新”和“旧”),并且语法非常
显式: SELECT DATEADD(DAY, 1, SYSDATETIME());

现在,没有人会认为上述内容是在系统日期和时间的当前值上添加除 1 天以外的任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.