SQL Server 2014 вставить / обновить значение smalldatetime с секундами

У меня странная проблема с типом данных smalldatetime в SQL Server.

У меня очень простой стол

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 минута Он отбрасывает любые секунды в значении даты и времени путем округления. Например:'2014-10-10 12:13:29' округляется до '2014-10-10 12:13:00' а также '2014-10-10 12:13:30' округляется до '2014-10-10 12:14:00'

Когда преобразование выполняется в 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 Link

Это одна из характеристик smalldatetime над datetime,

Документация 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/

Округляет все секунды до минут:

Временной интервал:

С 00:00:00 до 23:59:59

2007-05-09 23:59:59 будет округлять до

2007-05-10 00:00:00

см. главу smalldatetime Описание: https://msdn.microsoft.com/en-us/library/ms182418(v=sql.120).aspx

Другие вопросы по тегам