【问题标题】:TSQL DEFAULT CURRENT_TIMESTAMPTSQL 默认 CURRENT_TIMESTAMP
【发布时间】:2013-07-10 20:56:15
【问题描述】:

我有下表

CREATE TABLE T3
(
  DD DATETIME DEFAULT CURRENT_TIMESTAMP
)

当开始通过这个向 T3 插入行时:

INSERT T3 SELECT 1;

我明白了

1900-01-02 00:00:00.000
1900-01-02 00:00:00.000
1900-01-02 00:00:00.000
1900-01-02 00:00:00.000

为什么是 1900 年的值?

我正在使用 sql server express 2012 。我机器上的时钟是最新的。

【问题讨论】:

  • 您预计该语句的行为会是什么?首先试图理解SELECT 1背后的想法。
  • 你认为默认的 current_timestamp 是什么意思?
  • 为什么我得到 -2 ?我是否违反了 stackoverflow 指南?

标签: sql-server tsql sql-server-2012-express


【解决方案1】:

没有显式列列表的INSERT T3 将期望插入的值源包含表中除IDENTITY/ROWVERSION 或计算列之外的每一列的值。

您的表有一个这样的列,SELECT 语句源提供一列。所以结果是您将显式整数值1 插入到列DD

该列的数据类型是datetime,需要隐式转换。 SELECT CAST(1 AS DATETIME) 的结果是 1900-01-02 因此你看到的结果。

旧的datetime 数据类型允许从intfloat 进行隐式转换,并将数值视为自1900-01-01 以来的天数。 datetime2 等较新的数据类型不支持这些隐式转换,而是会引发错误。

仅当您没有为该列插入显式值时,才会应用默认约束值。

在您的情况下,您可以通过

来执行此操作
INSERT T3 DEFAULT VALUES;

或者

INSERT T3 (DD) VALUES (DEFAULT)

【讨论】:

  • SQL Server 中的“Day 0”是 1900-01-01 - 因此插入“1”会导致 1900-01-02
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2016-10-23
  • 2021-12-03
  • 2017-04-07
相关资源
最近更新 更多