gpt4 book ai didi

sql - 为什么此转换为 DATETIME2 包含额外的粒度?

转载 作者:行者123 更新时间:2023-12-05 01:24:19 26 4
gpt4 key购买 nike

我正在尝试将以下 DATETIME 转换为 DATETIME2:

DECLARE @x DATETIME = '2021-12-10 19:58:41.333'
SELECT CAST(@x AS DATETIME2)

结果是 2021-12-10 19:58:41.3333333。为什么转换添加 0.0003333s?

最佳答案

与某些人的理解相反,datetime 并不精确到 1/1000 秒,而是精确到 1/300 秒。这就是为什么 datetime 的最后一位总是 037,因为它们代表 0/300th、1/300th 和 2/300th 分别为一秒(3/300th 将再次为 0)。

但是,对于 datetime2,数据类型的精度可以是 0 - 70 表示精确到 1 秒,7 表示 100 纳秒或 1/10 微秒。

当您将 datetime 转换为 datetime2 时,datetime 仅精确到 1/300 秒这一事实反射(reflect)在转换后的值(请注意,对于旧版本的 SQL Server,这是不正确的),因此将显示 1/300 到新的准确度。

让我们取您拥有的值 2021-12-10 19:58:41.333。这里的.333是无限的,更像是.3333333333~。这是因为您不能用 10 进制数准确表示 1/3(或 1/300)。然后将您的值转换 (CAST) 为 datetime2。您省略了精度,因此默认精度为 7。这将为您提供 2021-12-10T19:58:41.3333333,因为 1/300 现在显示的精度高达 7(请注意,上面的精度为 100 纳秒,不是 100/3 纳秒)。

如果你有一个像 2021-12-10 19:58:41.357 这样的时间并将其转换为 datetime2(4) 你会得到 2021 -12-10 19:58:41.3567。如果您随后将其转换为 datetime2(7),您将获得 2021-12-10 19:58:41.3567000 作为“1/300th-ness”精度在转换为 datetime2(4) 时丢失。

如前所述,在旧版本的 SQL Server (2014 or prior) 中,上述情况并非如此。在这些旧版本中,datetime2021-12-10 19:58:41.333 转换为 datetime2(7) 的准确度较低值 2021-12-10 19:58:41.3330000。如果您使用的是旧版本并依赖此行为,则需要将您的 datetime 值显式转换/强制转换为 datetime2(3) 以避免可能的破坏性更改。

关于sql - 为什么此转换为 DATETIME2 包含额外的粒度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71472951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com