为什么SQL Server DATETIME类型将时间保存为1/300秒的滴答数?

9

SQLServer的日期时间格式存储为8个字节,其中前4个字节是自1900年1月1日以来的天数,另外4个字节是自午夜以来的滴答数。而一滴答是1/300秒。

我想知道为什么是1/300秒呢?这其中一定有历史原因。


我经常想知道为什么最接近午夜的时间是23:59:59.997。 - Jonathan
2
@Jonathan - 这通常是你应该使用独占式终端点(即第二天的午夜)来处理日期时间数据并想要完整一天价值的良好指示 - 如果你已经硬编码了 997 或使用其他技巧进行计算,那么如果你转移到 datetime2,你将不得不更改所有代码。 - Damien_The_Unbeliever
1
它可以追溯到Sybase时代。最大的32位有符号整数允许精度高达每秒24,855个滴答,所以我也对此感到好奇。 - Martin Smith
1个回答

6
是的,有一个历史原因:UNIX!
关于详细信息,请阅读Joe Celko的优秀文章
以下是您要查找的详细信息:
T-SQL中的时间数据曾经是“UNIX系统时钟滴答声”的囚犯,并且只能到三位小数秒(存在舍入误差)。新的ANSI / ISO数据类型可以到达七位小数秒,并具有真正的DATE和TIME数据类型。由于它们是新的,大多数程序员尚未使用它们。

1
他是在说Unix每秒钟也只有300个时钟周期吗?还是说两者都使用了“tick”的概念? - Martin Smith
这是关于第一个Unix内部时钟的旧分辨率的问题 - 与它们如何打勾无关,只与它们的时间分辨率有关。SQL Server具有相当多的旧Unix(Sybase)血统,只需检查没有时间戳的时间戳列即可 ;) - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接