我昨天用以下代码建立了一个表。该代码运行时未报告任何错误消息,并且该表显示在对象资源管理器中正确设置。
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()默认表显示昨天的日期
FlightDate
Getdate()
和
具有DateAdd默认值的DepTime列显示的错误时间为18:45:02。我写这篇文章的当前时间是11.04。
DateAdd
有谁知道这是怎么回事。
在此先感谢您提供的任何帮助。
您可能会发现在SQL Server中对默认值的处理有点违反直觉。语法为:
DEFAULT constant_expression
碰巧SQL Server _扩展_了对的定义constant_expression以包括非确定性的标量函数,例如getdate()。这些函数每次调用时都会返回不同的值,即使使用相同的参数也是如此。文档中的定义为:
constant_expression
getdate()
仅一个常量值,例如字符串;标量函数(系统函数,用户定义函数或CLR函数);或NULL可以用作默认值。
但是,SQL Server不会将定义扩展到此类函数的 表达式 。而是在创建表并插入常量值时对表达式求值。
不幸的是,完成触发器的一种方法是使用触发器。或者,您可以将值保留为,NULL并创建一个计算列以计算六个小时的日期,因此:
NULL
create table . . . _DepTime time, DepTime as (cast(dateadd(hour, 6 _DepTime) as time) )