2016-11-22 135 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我在我的文章中進行了更改 –