2016-11-22 115 views
2

我在SQL Server中的smalldatetime数据类型有一个奇怪的问题。SQL Server 2014插入/更新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

发生这种情况是因为smalldatetime的精度为1分钟。它通过四舍五入来丢弃datetime值中的任何秒。对于e.g: '2014-10-10 12:13:29'被四舍五入到'2014-10-10 12:13:00''2014-10-10 12:13:30'四舍五入到'2014-10-10 12:14:00'

+0

非常感谢解决方案中,SMALLDATETIME看起来非常误导与我会一直抓我的头几个小时 – Trent

+0

秒的空间@Trent欢迎您:) –

3

这是的smalldatetime超过datetime的特征之一。

Microsoft documentation on smalldatetime

主要分化是它四舍五入为最接近分钟。如果你想看到秒(和毫秒),那么你需要考虑数据类型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/

+1

尽管我需要补充一点,如果你使用的是支持** datetime2 **的更新版本,并且你正在实现,那么你应该使用它,而不是'datetime'。 –

+0

当然,这是一个很好的观点。我为支持2008年的供应商工作,因此无法利用这一点。 –

3

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

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

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

--Result 
[email protected]   datetime 
------------------------- ----------------------- 
--1955-12-13 12:43:00  1955-12-13 12:43:00.000 

看看MSDN Link

+0

虽然它们没有设置为零,但如果它们是59秒,那么它不会将秒数更改为零并使用该值。它轮到最接近的分钟(在这种情况下,这将是一分钟) –

+0

@RichBenner是的,你是对的 –

+0

@RichBenner我在我的文章中进行了更改 –