Ale*_*dru 3 sql t-sql sql-server
我正在尝试将以下内容投射DATETIME到DATETIME2:
DECLARE @x DATETIME = '2021-12-10 19:58:41.333'
SELECT CAST(@x AS DATETIME2)
Run Code Online (Sandbox Code Playgroud)
结果是2021-12-10 19:58:41.3333333。为什么演员要添加 0.0003333s?
与某些人的理解相反,datetime不是精确到 1/1000 秒,而是精确到1/300秒。这就是为什么 a 的最后一位数字datetime始终是0、3或7,因为它们分别代表一秒的 0/300、1/300 和 2/300(又是 3/300 0)。
但是,对于datetime2,数据类型的精度可以为0- 7。0意思是精确到 1 秒,即7100 纳秒或 1/10 微秒。
当您将 a 转换datetime为 a时,仅精确到 1/300 秒的datetime2事实反映在转换后的值中(请注意,对于旧版本的 SQL Server,情况并非如此),因此将显示 1/300 秒到 adatetime新的准确度。
让我们获取您拥有的值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。如果您随后将其转换为 a,datetime2(7)您将得到的结果2021-12-10 19:58:41.3567000是,当它转换为 a 时,“1/300 度”精度会丢失datetime2(4)。
正如所提到的,在旧版本的 SQL Server(2014 或更早版本)中,上述情况并不正确。在这些旧版本中,该datetime值转换为value2021-12-10 19:58:41.333的准确度会较低。如果您使用旧版本并依赖此行为,则需要将您的值显式转换/转换为 a以避免可能的重大更改。datetime2(7)2021-12-10 19:58:41.3330000datetimedatetime2(3)
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |