【问题标题】:SQL Server - computed date columnSQL Server - 计算日期列
【发布时间】:2017-01-22 19:00:09
【问题描述】:

我想创建“会议”表并将 EndDate 设置为 StartDate + ConferenceDays。有什么办法吗?

create table Conferences(
    ConferenceID int not null primary key,
    ConferenceName varchar(50) not null,
    ConferenceDays int not null,
    StartDate date not null,
    EndDate date not null,
)

【问题讨论】:

  • 你想要一个新列,它是所有三个的总和?
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文? DB2?火鸟?
  • @YashveerSingh 如果 StartDate 是 2016-01-01 并且 ConferenceDays 是 4,我希望 EndDate 是 2016-01-05。
  • @a_horse_with_no_name 我使用 Microsoft SQL Server
  • @EuroPe 您可以根据需要更改公式我认为答案将使用计算列我添加了一个带有公式的示例列,您可以相应地更改

标签: sql sql-server calculated-columns create-table


【解决方案1】:

对于 SQL 服务器:

create table Conferences(
    ConferenceID int not null primary key,
    ConferenceName varchar(50) not null,
    ConferenceDays int not null,
    StartDate date not null,
    EndDate AS (dateadd(day,ConferenceDays, StartDate)) PERSISTED
)

【讨论】:

  • 非常感谢!!它完美地工作。我尝试使用“dateadd”进行类似操作,但使用“Deafult”或“Check”,这里应该是“AS”。 :) 谢谢,再来一次 :)
  • 您应该在回答中解释persisted 的含义
【解决方案2】:

我建议重新考虑一下。如果 EndDate 始终为 StartDate + ConferenceDays,那么您基本上有冗余数据,这可能被视为违反规范化规则。

如果您使用的是 ORM,或者您已经定义了一些代表数据表的类,那么我建议添加这样的属性:

partial class Conference {

   DateTime EndDate { get { return this.StartDate.AddDays( this.ConferenceDays ); } }
   ... etc.
}

这对你有用吗?

【讨论】:

  • 在需要按 EndDate 排序或在 WHERE 子句中使用时,将 EndDate 作为单独的 DB 列很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多