一尘不染

使用Getdate和DateAdd的默认设置不起作用

sql

我昨天用以下代码建立了一个表。该代码运行时未报告任何错误消息,并且该表显示在对象资源管理器中正确设置。

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

但是在今天检查表时FlightDateGetdate()默认表显示昨天的日期

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

有谁知道这是怎么回事。

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


阅读 231

收藏
2021-05-16

共1个答案

一尘不染

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

DEFAULT constant_expression

碰巧SQL Server _扩展_了对的定义constant_expression以包括非确定性的标量函数,例如getdate()。这些函数每次调用时都会返回不同的值,即使使用相同的参数也是如此。文档中的定义为:

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

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

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

create table . . .
    _DepTime time,
    DepTime as (cast(dateadd(hour, 6 _DepTime) as time) )
2021-05-16