Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建新的计算列_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 创建新的计算列

Sql 创建新的计算列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我知道这很容易,但我不记得怎么做了,我想在下面添加一个新列,名为Total Capacity,这是我的datediff结果*我的Capcity。但就我的一生而言,我无法理解它。你能帮忙吗 SELECT Capacity.StartDate ,Capacity.EndDate, DATEDIFF(d,Capacity.StartDate ,Capacity.EndDate)+1 AS DaysOpen ,Capacity.Capacity ,Capacity.Site_Skey

我知道这很容易,但我不记得怎么做了,我想在下面添加一个新列,名为Total Capacity,这是我的datediff结果*我的Capcity。但就我的一生而言,我无法理解它。你能帮忙吗

SELECT
  Capacity.StartDate
  ,Capacity.EndDate, DATEDIFF(d,Capacity.StartDate
  ,Capacity.EndDate)+1 AS DaysOpen
  ,Capacity.Capacity
  ,Capacity.Site_Skey
FROM
  Capacity
结果

  StartDate   EndDate       DaysOpen   Capacity TotalCapacity
  01/05/2010  30/09/2010    153        46       7038
像这样的

SELECT
  Capacity.StartDate
  ,Capacity.EndDate
  ,DATEDIFF(d, Capacity.StartDate, Capacity.EndDate) + 1 AS DaysOpen
  ,Capacity.Capacity
  ,(DATEDIFF(d, Capacity.StartDate, Capacity.EndDate) + 1) * Capacity.Capacity AS TotalCapacity
FROM
  Capacity

您可以轻松地将这两列添加到表中,即计算的、持久化的列。然后,您就可以轻松地选择它们——它们是表中的新列,您可以像其他列一样进行选择——如果需要,您甚至可以在它们上添加索引

ALTER TABLE [dbo].[Capacity]
    ADD DaysOpen AS DATEDIFF(d, StartDate, EndDate) PERSISTED

ALTER TABLE [dbo].[Capacity]
    ADD TotalCapacity AS DATEDIFF(d, StartDate, EndDate) * [Capacity] PERSISTED
现在您可以发布:

SELECT
    StartDate, EndDate,
    DaysOpen,
    Capacity,
    TotalCapacity
FROM
    Capacity
更新:如果要使用
DATEDIFF+1
方法,请使用以下列规范:

ALTER TABLE [dbo].[Capacity]
    ADD DaysOpen AS (DATEDIFF(d, StartDate, EndDate) + 1) PERSISTED

ALTER TABLE [dbo].[Capacity]
    ADD TotalCapacity AS (DATEDIFF(d, StartDate, EndDate) + 1) * [Capacity] PERSISTED

TotalCapacity代表什么?开放天数*容量,在我的示例46中是每日容量。你可以,但我不会。规范化的一部分是不存储计算的值。@DanBracuk:同意-但反规范化的一部分是使其工作,如果您经常需要这些值,那么计算并(冗余地)存储这些值以供快速访问可能不是那么糟糕。……嗨,Marc_,您的解决方案的第二部分计算不正确,例如,当我以46个容量运行153次时,总容量应该是7038次,但使用您的解决方案,我只得到6992次?@wafw1971:
DATEDIFF
对于您给出的这两个日期是152次(而不是您使用的153次)。因此,根据您的定义,您可能需要在
DaysOpen
TotalCapacity
计算列的规范中使用
DATEDIFF()+1
。您好,Marc,我确实将+1添加到了第一个解决方案中,这是我唯一在EndDate之后和*[Capacity]之前添加+1的第二个解决方案我得到了不正确的结果。谢谢
SELECT
    StartDate, EndDate,
    DaysOpen,
    Capacity,
    TotalCapacity
FROM
    Capacity
ALTER TABLE [dbo].[Capacity]
    ADD DaysOpen AS (DATEDIFF(d, StartDate, EndDate) + 1) PERSISTED

ALTER TABLE [dbo].[Capacity]
    ADD TotalCapacity AS (DATEDIFF(d, StartDate, EndDate) + 1) * [Capacity] PERSISTED