Sql server SQL Server GetUTCDate作为默认值无效
使用Microsoft SQL Server,我希望列在默认情况下具有当前UTC日期和时间。当插入一行且未为该列指定值时,它应默认为服务器上的UTC日期 我使用以下内容创建表:Sql server SQL Server GetUTCDate作为默认值无效,sql-server,database,tsql,datetime,Sql Server,Database,Tsql,Datetime,使用Microsoft SQL Server,我希望列在默认情况下具有当前UTC日期和时间。当插入一行且未为该列指定值时,它应默认为服务器上的UTC日期 我使用以下内容创建表: CREATE TABLE [dbo].[Status] ( [ProcessNam] [varchar](30) NOT NULL, [LastCheckIn] [datetime2] NOT NULL DEFAULT GETUTCDATE(), [Failures] [tinyint] NOT
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()
返回正确的时间戳。您正在插入“”(空字符串)作为LastCheckIn值,因此不使用默认值。试试这个
INSERT INTO DBO.STATUS (ProcessNam) VALUES ('TEST')
由于DateTimes的解析方式,''相当于0(零),并且由于DateTimes的存储方式,0等于1900-01-01 00:00:00.000000。
“
不同于NULL
您在插入中提供了一个值-一个空字符串-这就是为什么不使用默认值的原因。您应该明确列出要在其中插入值的列-如果您不想在LastCheckIn
中插入任何内容,则不要将其包含在要插入值的列列表中-在这种情况下,默认值将用在标题中。令人震惊的是,一个空字符串似乎被解析为1900-01-01。@usr它有点不正确-它被解析为0。将1900-01-01转换为日期时间(自1900-01-01以来的天数)。您还可以使用插入DBO.STATUS值('TEST',default,default)
@Aツ 我建议不要这样做——你存了什么?输入列名?为什么@Aaron_Bertrand问题的主题不是缺少的列名,而是插入一些默认值。当然,我最好把它们都列出来,但这不是主题。