SQL Server 2014 insert/update 带秒的小日期时间值
SQL Server 2014 insert/update smalldatetime value with seconds
我在 SQL 服务器中遇到一个关于 smalldatetime 数据类型的奇怪问题。
我有一个很基础的table
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
它不包括秒数。这是为什么?
发生这种情况是因为 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'
这是 smalldatetime
优于 datetime
的特点之一。
Microsoft documentation on smalldatetime
主要区别在于它四舍五入到最接近的分钟。如果你想看到秒(和毫秒),那么你需要考虑 datetime
数据类型。
然而,在您的示例中,它应该 return 值 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
它把所有秒舍入到分钟:
Time range:
00:00:00 through 23:59:59
2007-05-09 23:59:59 will round to
2007-05-10 00:00:00
参见章节 smalldatetime 说明:https://msdn.microsoft.com/en-us/library/ms182418(v=sql.120).aspx
当转换为 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
我在 SQL 服务器中遇到一个关于 smalldatetime 数据类型的奇怪问题。
我有一个很基础的table
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
它不包括秒数。这是为什么?
发生这种情况是因为 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'
这是 smalldatetime
优于 datetime
的特点之一。
Microsoft documentation on smalldatetime
主要区别在于它四舍五入到最接近的分钟。如果你想看到秒(和毫秒),那么你需要考虑 datetime
数据类型。
然而,在您的示例中,它应该 return 值 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
它把所有秒舍入到分钟:
Time range:
00:00:00 through 23:59:59
2007-05-09 23:59:59 will round to
2007-05-10 00:00:00
参见章节 smalldatetime 说明:https://msdn.microsoft.com/en-us/library/ms182418(v=sql.120).aspx
当转换为 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