【问题标题】:SQL Server 2014 insert/update smalldatetime value with secondsSQL Server 2014 以秒为单位插入/更新 smalldatetime 值
【发布时间】:2016-11-22 10:06:01
【问题描述】:

我对 SQL Server 中的 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

它不包括秒数。这是为什么呢?

【问题讨论】:

    标签: sql sql-server date smalldatetime


    【解决方案1】:

    这是因为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 看起来很容易误导我数小时内的空间
    【解决方案2】:

    这是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/

    【讨论】:

    • 虽然我需要补充一点,如果您正在使用支持 datetime2 的更新版本并且您正在实施,那么您应该使用它,而不是 datetime
    • 当然,这是一个很好的观点。我为一个支持 2008 年的供应商工作,所以还不能利用它。
    【解决方案3】:

    当转换为 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

    【讨论】:

    • 虽然它们没有设置为零,但如果它们是 59 秒,那么它不仅仅是将秒数更改为零并使用该值。它四舍五入到最接近的分钟(在这种情况下,将是一分钟)
    • @RichBenner 我在帖子中进行了更改
    【解决方案4】:

    它从秒到分钟四舍五入:

    时间范围:

    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

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 2015-09-16
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多