Tsql:datediff没有使用DEFAULT getdate()

时间:2016-12-22 15:55:46

标签: sql sql-server tsql

我找到了一个包含date类型列的表,默认设置为:getdate() 但是当我尝试在两个分离的原始数据上执行datediff()时,它总是给我0或一些常量值。如何指定日期的默认值并执行可行的datediff()

重现我的问题的示例代码

CREATE TABLE Test
(
    id INT PRIMARY KEY NOT NULL IDENTITY,
    date DATE DEFAULT getdate() NOT NULL,
    user VARCHAR(100)
);
CREATE UNIQUE INDEX Test_id_uindex ON Test (id);

在中间或更长时间内以1秒的延迟调用以下原始

  • INSERT INTO Test(user) VALUES ('Cool1')
  • INSERT INTO Test(user) VALUES ('Cool2')

现在查看下面查询的奇怪输出:

  1. SELECT getdate() as date
  2. 输出:

    date   
    2016-12-22 10:42:40
    
    1. SELECT * from Test
    2. 输出:

      id    date          user
      1     2016-12-22    Cool    
      2     2016-12-22    Cool1
      

      最后一个:

      SELECT
        a.id,
        datediff(MILLISECOND, a.date, b.date)
      FROM Test a
        JOIN Test b ON a.id = b.id + 1
      

      输出:

      id    difTime
      2     0
      

1 个答案:

答案 0 :(得分:5)

你的代码很好。您将date数据类型与datetimedatetime2混淆。更改表定义以使用存储时间和日期的类型:

CREATE TABLE Test (
    id INT PRIMARY KEY NOT NULL IDENTITY,
    date DATETIME DEFAULT getdate() NOT NULL,
    user VARCHAR(100)
);

这是混淆的自然场所,因为GETDATE()返回带有时间组件的值。但是,DATE不支持时间组件。

您也可以使用CURRENT_TIMESTAMP,其名称更能唤起它返回时间的事实。