我有一个结构如下的表:
CREATE TABLE [TESTTABLE]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[DateField] [datetime] NULL,
[StringField] [varchar](50),
[IntField] [int] NULL,
[BitField] [bit] NULL
)
我执行以下代码:
BEGIN
INSERT INTO TESTTABLE (IntField, BitField, StringField, DateField)
VALUES ('1', 1, 'hello', {ts '2009-04-03 15:41:27.378'});
SELECT SCOPE_IDENTITY()
END
然后
select * from testtable with (NOLOCK)
我的结果显示:
2009-04-03 15:41:27.*377*
用于DateField
列。
你知道为什么我看起来损失了一毫秒吗?
发布于 2009-04-03 20:00:05
SQL Server仅将时间存储到大约1/300秒。它们总是落在0、3和7毫秒。例如,从0开始,以最小的增量递增:
00:00:00.000
00:00:00.003
00:00:00.007
00:00:00.010
00:00:00.013
..。
如果你需要毫秒级的精确度,那就没有什么好的办法了。我见过的最好的选择是将值存储在自定义数字字段中,并在每次获取值时重新构建它,或者将其存储为已知格式的字符串。为了提高速度,您可以(可选地)将“近似”日期存储在原生date类型中,但它引入了通常不需要的概念上的复杂性。
发布于 2009-04-03 20:01:01
SQL Server 2008具有更高的精确度。datetime2类型将准确地存储值,如下所示: 2008-12-19 09:31:38.5670514 (精确度为100纳秒)。
参考:time and datetime2 - Exploring SQL Server 2008's New Date/Time Data Types
发布于 2009-04-03 19:51:58
SQL Server datetime
类型的分辨率仅为1/300秒(~3.33̅ms),因此您可能会看到舍入误差。
https://stackoverflow.com/questions/715432
复制相似问题