12

我正在使用用户表并希望设置“试用期结束日期”。基本上,作为试用期的一部分,每个新用户从加入之日起有 2 个月的完整时间。我看到我可以在我的用户表的列中放置一个公式,但我想知道我是否应该有一个脚本来更新它,或者这是否是使用计算列的可接受时间。我访问此表以获取各种信息,并且偶尔会根据性能里程碑成就更新用户行。申请日期永远不会改变/更新。

我的问题是:在这种情况下使用计算列是一种好习惯,还是会在每次更新该行时重新计算(即使我不打算更新应用日期)?我不想在将来更新行时产生更多开销。

我在试用结束日期的列定义中使用的公式:

(dateadd(day,(-1),dateadd(month,(3),dateadd(day,(1)-datepart(day,[APP_DT]),[APP_DT]))))
4

3 回答 3

15

看到这个日期很可能一旦设置就永远不会改变,它可能不是计算列的好候选。

毕竟:一旦您在该表中插入一行,您就可以轻松地计算“试用期结束”日期,然后(例如在触发器中),并且一旦设置,该日期将永远不会改变。

因此,虽然您绝对可以这样做,但我可能更喜欢使用AFTER INSERT触发器(或操作的存储过程INSERT),它只计算一次,然后存储该日期。

此外,作为提醒:每次都在计算仅包含公式的计算列以访问它 - 请注意这一点。也就是说,除非您指定PERSISTED关键字,否则在这种情况下,结果将与行中的其他数据一起存储,这将更适合这里 - 同样,因为该值一旦计算就不会改变以后再。

于 2013-04-05T14:46:57.410 回答
11

如果您想稍后延长某人的试用期而不必更改他们的申请日期,那么计算列不是要走的路。为什么不对两列都使用DEFAULT约束?

USE tempdb;
GO

CREATE TABLE dbo.foo
(
  MemberID INT IDENTITY(1,1),
  JoinDate DATE NOT NULL DEFAULT SYSDATETIME(),
  ProbationEndDate NOT NULL DEFAULT 
    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0))
);

INSERT dbo.foo DEFAULT VALUES;

SELECT MemberID, JoinDate, ProbationEndDate FROM dbo.foo;

结果:

MemberID    JoinDate      ProbationEndDate
--------    ----------    ----------------
1           2013-04-05    2013-06-30

(请注意,我使用了一种稍微不那么令人费解的方法来获得两个月的月底。)

于 2013-04-05T14:51:34.773 回答
0

插入数据时没有开销;只有当您读取该列时,才会为该列计算值。所以我想说你的方法是正确的。

于 2013-04-05T14:47:12.443 回答