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
Округляет все секунды до минут:
Временной интервал:
С 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