为什么 SQL Server 会删除传递给 SMALLDATETIME 字段的值的秒数?

age*_*r85 3 sql-server datetime

我在用着

Microsoft SQL Server 2019 (RTM-CU22) (KB5027702) - 15.0.4322.2 (X64)
2023 年 7 月 27 日 18:11:00 版权所有 (C) 2019 Microsoft Corporation Express Edition(64 位),适用于 Windows 10 Pro 10.0(内部版本 19045: )

我有一张用它创建的表

CREATE TABLE yokogawaReading(
yokogawaReading INTEGER NOT NULL IDENTITY (1, 1),
readingDate SMALLDATETIME not null,
celsiusTemperature1 DECIMAL (4,2),
relativeHumidity1 DECIMAL (5,3),
celsiusTemperature2 DECIMAL (4,2),
relativeHumidity2 DECIMAL (5,3)
);
Run Code Online (Sandbox Code Playgroud)

每当我尝试插入字段值包含readingDate非零秒值的记录时,例如,

EXEC sp_set_session_context @key = N'readingDateTime', @value = '2023/11/14 11:09:30';

EXEC sp_set_session_context @key = N't1', @value =20.027777777777777777777777778;

EXEC sp_set_session_context @key = N'rh1', @value =44.97;

EXEC sp_set_session_context @key = N't2', @value =18.916666666666666666666666667;

EXEC sp_set_session_context @key = N'rh2', @value =38.485;

"INSERT INTO yokogawaReading (readingDate, celsiusTemperature1, relativeHumidity1, celsiusTemperature2, relativeHumidity2) VALUES (CONVERT(datetime, SESSION_CONTEXT(N'readingDateTime'), 101), CONVERT(decimal(7, 2), SESSION_CONTEXT(N't1')), CONVERT(decimal(5, 2), SESSION_CONTEXT(N'rh1')), CONVERT(decimal(7, 2), SESSION_CONTEXT(N't2')), CONVERT(decimal(5,2), SESSION_CONTEXT(N'rh2')));"
Run Code Online (Sandbox Code Playgroud)

生成的记录以秒数为“00”的时间结束。我检查了SMALLDATETIME 上的文档,它肯定包括秒,但不是毫秒。为什么会发生这种情况?我该如何解决?

[附录]我想我可能已经在这个论坛问题上找到了为什么问题的答案。(参见TG于2011-10-26 : 17:37:20的回复。)TG说

Sql 服务器将smalldatetime 存储为一对2 字节的smallint。第一个smallint 是1900-01-01 的某种日偏移量。第二个smallint 是距0:00:00 的分钟偏移量。

如果这是准确的,那么它无法存储秒数,并且我上面提到的文档一定是不正确的。是吗?

Bra*_*adC 10

您链接到的文档明确指出,smalldatetime 的秒数始终为零:

定义与一天中的时间组合的日期。该时间基于 24 小时制,秒始终为零 (:00),并且没有秒小数部分。

以及后面的描述:

准确度:一分钟

  • @agerber85 甚至该文档的该部分也包含以下说明:“ss 是两位数字,范围从 00 到 59,代表秒。**29.998 秒或更短的值将向下舍入到最接近的分钟。29.999 的值秒或更长的时间四舍五入到最接近的分钟**。” (5认同)