我昨天用以下代码设置了一个表。代码运行时没有报告错误消息,表格在对象资源管理器中正确设置。
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。
有谁知道出了什么问题。
提前感谢您提供的任何帮助。
答案 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) )