2

我对 SQL Server 中的 smalldatetime 数据类型有一个奇怪的问题。

我有一张非常基本的桌子

create table datetest (
    value   smalldatetime   not null
)

当我运行以下

insert into datetest
values ('2016-12-29 21:30:00');

我看到的值为2016-12-29 21:30:00

然后当我运行以下

update datetest
set value = '2016-12-29 21:31:30'

我看到的值为2016-12-29 21:31:00

它不包括秒数。为什么是这样?

4

4 回答 4

5

发生这种情况是因为精度smalldatetime为 1 分钟。它通过四舍五入丢弃日期时间值中的任何秒数。例如: '2014-10-10 12:13:29'四舍五入到'2014-10-10 12:13:00''2014-10-10 12:13:30'四舍五入到'2014-10-10 12:14:00'

于 2016-11-22T10:08:58.193 回答
3

smalldatetime这是over的特点之一datetime

关于 smalldatetime 的 Microsoft 文档

主要区别在于它四舍五入到最接近的分钟。如果您想查看秒(和毫秒),那么您需要考虑datetime数据类型。

但是,在您的示例中,它应该返回值 2016-12-29 21:32:00 因为它从 30 秒四舍五入到下一分钟。任何小于 30 秒的内容都会向下舍入。例子;

CREATE TABLE #DateTest (ID int, DateValue smalldatetime)
INSERT INTO #DateTest (ID, DateValue)
VALUES
(1,'2016-12-29 21:31:29')
,(2,'2016-12-29 21:31:30')

SELECT * FROM #DateTest

输出

ID  DateValue
1   2016-12-29 21:31:00
2   2016-12-29 21:32:00

一些进一步的阅读链接;

http://blog.sqlauthority.com/2010/06/01/sql-server-precision-of-smalldatetime-a-1-minute-precision/

http://sqlcoach.blogspot.co.uk/2007/08/sql-server-storing-time-coming-soon.html

http://sqlhints.com/2016/10/10/difference-between-smalldatetime-and-datetime-data-types-in-sql-server/

于 2016-11-22T10:09:49.593 回答
3

当转换为 datetime 时,smalldatetime 值被复制到 datetime 值。小数秒将成为下一个最接近的分钟。以下代码显示了将 smalldatetime 值转换为 datetime 值的结果。

 DECLARE @smalldatetime smalldatetime = '1955-12-13 12:43:10';  
DECLARE @datetime datetime = @smalldatetime;  

SELECT @smalldatetime AS '@smalldatetime', @datetime AS 'datetime';  

--Result  
--@smalldatetime          datetime  
------------------------- -----------------------  
--1955-12-13 12:43:00     1955-12-13 12:43:00.000  

看看MSDN 链接

于 2016-11-22T10:11:05.080 回答
1

它将所有秒数四舍五入:

时间范围:

00:00:00 至 23:59:59

2007-05-09 23:59:59 将四舍五入

2007-05-10 00:00:00

见小日期时间章节描述https ://msdn.microsoft.com/en-us/library/ms182418(v=sql.120).aspx

于 2016-11-22T10:10:44.867 回答