使用 Getdate 和 DateAdd 的默认值不起作用

defaults using Getdate and DateAdd are not working

我昨天使用以下代码设置了一个 table。代码 运行 没有报告任何错误消息,并且 table 在对象资源管理器中正确设置。

Create Table PriceTable
             (Airport_IACO_Code Varchar (4) NOT NULL,
              Airline_IACO_Code Varchar (3) NOT NULL,
              FlightDate Date NOT NULL Default Getdate(),
              DepTime Time NOT NULL Default DATEADD(hour, 6, GETDATE()),
              Price Smallmoney,
              RouteDiscontinuedOrCommences Varchar (15),
              )
GO

但是在今天检查 table 时,具有 Getdate() 默认值的 FlightDate 显示的是昨天的日期

具有 DateAdd 默认值的 DepTime 列显示不正确的时间 18:45:02。我写这篇文章的当前时间是 11.04。

有谁知道哪里出了问题。

在此先感谢您提供的任何帮助。

您可能会发现 SQL Server 中默认值的处理有点违反直觉。语法是:

DEFAULT constant_expression

碰巧 SQL 服务器 扩展 constant_expression 的定义以包括非确定性标量函数,例如 getdate()。这些函数 return 每次调用时都有不同的值,即使参数相同。 documentation中的定义是:

Only a constant value, such as a character string; a scalar function (either a system, user-defined, or CLR function); or NULL can be used as a default.

但是,SQL服务器没有将定义扩展到表达式这样的函数。相反,在创建 table 并插入常量值时计算表达式。

不幸的是,完成您想要的任务的一种方法是使用触发器。或者,您可以将该值保留为 NULL 并创建一个计算列来计算六小时的日期,因此:

create table . . .
    _DepTime time,
    DepTime as (cast(dateadd(hour, 6 _DepTime) as time) )