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

时间:2015-02-20 11:06:00

标签: sql sql-server sql-server-2014

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

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

但是,今天在查看表格时,FlightDate默认显示的Getdate()显示昨天的日期

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

有谁知道出了什么问题。

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

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

DEFAULT constant_expression

恰好SQL Server 扩展 constant_expression的定义以包含非确定性标量函数,例如getdate()。这些函数在每次调用时返回不同的值,即使使用相同的参数。 documentation中的定义是:

  

只有一个常量值,例如字符串;标量函数   (系统,用户定义或CLR功能);或者可以使用NULL   作为默认值。

但是,SQL Server不会将定义扩展到此类函数的表达式。而是在创建表并插入常量值时计算表达式。

不幸的是,实现目标的一种方法是使用触发器。或者,您可以将值保留为NULL并创建计算列以计算六小时的日期:

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