使用 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) )
我昨天使用以下代码设置了一个 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) )