【问题标题】:SQL Server GetUTCDate invalid as defaultSQL Server GetUTCDate 默认无效
【发布时间】:2015-03-16 16:31:21
【问题描述】:

使用 Microsoft SQL Server 我希望列具有默认的当前 UTC 日期和时间。当插入一行并且没有为该列指定值时,它应该默认为服务器上的 UTC 日期。

我使用以下方法创建表:

CREATE TABLE [dbo].[Status]
(
    [ProcessNam] [varchar](30) NOT NULL,
    [LastCheckIn] [datetime2] NOT NULL DEFAULT GETUTCDATE(),
    [Failures] [tinyint] NOT NULL DEFAULT ((0)),

    CONSTRAINT [PK_AST_PING] 
      PRIMARY KEY CLUSTERED ([ProcessNam] ASC)
          WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

但是当我使用时:

INSERT INTO dbo.Status VALUES ('TEST', '', '')

该列最终包含1900-01-01 00:00:00.000000

如果我使用

SELECT GETUTCDATE()

返回正确的时间戳。

【问题讨论】:

  • '' 不同于 NULL
  • 您在INSERT 中提供了一个值——一个空字符串——这就是为什么不使用默认值的原因。您应该明确列出您想要插入值的列 - 如果您不想在 LastCheckIn 中插入任何内容,则不要将其包含在您要插入的列列表中values into - 在这种情况下,将使用默认值来代替

标签: sql-server database tsql datetime


【解决方案1】:

您正在插入 ''(一个空字符串)作为 LastCheckIn 值,因此不使用默认值。试试这个;

INSERT INTO DBO.STATUS (ProcessNam) VALUES ('TEST')

由于 DateTimes 的解析方式,'' 等于 0(零),并且由于 DateTimes 的存储方式,0 等于 1900-01-01 00:00:00.000000。

【讨论】:

  • 令人震惊的是,一个空字符串似乎在 1900-01-01 被解析。
  • @usr 这有点不对 - 它被解析为 0。它转换为 1900-01-01 作为日期时间(自 1900-01-01 以来的天数)。
  • 你也可以使用INSERT INTO DBO.STATUS VALUES ('TEST',default,default)
  • @Aツ 我建议不要这样做 - 你保存了什么?键入列名?为什么? You know that it will break as soon as someone adds a new column or changes the order, right?
  • @Aaron_Bertrand 问题的主题不是缺少列名,而是插入了一些默认值。当然,我最好把它们都列出来,但同样,这不是主题。
猜你喜欢
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2014-10-24
  • 2020-12-11
  • 2014-02-08
  • 2010-09-14
  • 2014-08-18
相关资源
最近更新 更多