使用 Getdate 和 DateAdd 的默认值不起作用
Posted
技术标签:
【中文标题】使用 Getdate 和 DateAdd 的默认值不起作用【英文标题】:defaults using Getdate and DateAdd are not working 【发布时间】:2015-02-20 11:05:59 【问题描述】:我昨天用以下代码设置了一个表。代码运行时未报告任何错误消息,并且该表在对象资源管理器中正确设置。
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。
有谁知道怎么回事。
提前感谢您提供的任何帮助。
【问题讨论】:
哪些 dmbs? (dateadd 和 getdate 不是 ANSI SQL。) 我不懂qs 对不起,我只是问您使用的是哪种数据库产品。如果您使用正在使用的数据库产品标记您的问题,则更容易获得帮助 - 特别是在涉及非标准 SQL 时。 @frustrationmultiplied,你检查过 SQL Server 实例机器上的日期和时间吗? 您确实意识到存储在这些列中的日期时间将是插入时的服务器日期时间,对吗?而不是在您查询或选择它们的时候,对吧? 【参考方案1】:您可能会发现在 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) )
【讨论】:
我希望 FlightDate 列是今天的日期。这就是我使用 getdate() 的原因。我可以将计算列用于 DepTime 列 @frustrationmultiplied 。 . .将时间和日期分成两列似乎很尴尬。 谁能解释一下下面的代码是如何工作的。创建表。 . . _FlightDate 日期,FlightDate as (cast(dateadd(hour, 6 _FlightDate) as date)) 戈登你可能是对的。我可以只使用一列作为航班日期和时间 如果我这样做了,我将如何设置输入的时间必须至少距当前时间 6 小时。原因是一些航空公司允许人们在同一天预订和飞行,只要他们的航班距离预订时间(当前时间)6小时以上是关于使用 Getdate 和 DateAdd 的默认值不起作用的主要内容,如果未能解决你的问题,请参考以下文章
用于 getdate() 和 dateadd() 的 Linq to SQL