如何检查计算列上的某些条件?

时间:2014-12-31 19:26:07

标签: sql sql-server tsql

我在this page问了我的问题,但没有解决。

我有一个名为Circulation的表(在图书馆管理系统中。) 列名称: - IsReturnedDelay StartDateTimeEndDate

我在此表格中保存了CheckinCheckout这样的方式,即有一个名为IsReturned的列,当图书结帐时它是equal到{{1}当书籍返回库false时,它等于checkin

我想计算结帐的延迟

此表中的列是trueStartDateTime(计算列为" StartDate" +"时间") 。我想计算延迟,直到文件没有返回。 (直到EndDate列为假)使用计算列。

我需要,如果IsReturned列为true,则Delay列的值不应更改,但如果不是,则应更新。

如果IsReturned我使用以下代码更新延迟列,但如何将此代码更改为“{1}} IsReturned = 1”。

IsReturned = 0

更新:

我的表是这样的:

t change the delay value if the

我觉得你还不明白我的桌子。 EndDate也是一个计算列,它是" StartDate + Time" (那个时间来自c#Program以分钟为单位)。因此,如果来自库的Checkedout,StartDate和EndDate都有值,但IsReturned为false,当书Checkedin时,IsReturned等于true。 我想计算"延迟"计算列中的列,以便: 1.当IsReturned = 0(书籍已经签出)时,延迟应根据以下公式计算:

SELECT   (DATEDIFF(minute,DATEADD(day, [Time],[StartDate]),GETDATE()))
FROM  dbo.Circulation 
WHERE Id= @Id

2。当IsReturned = 1(书籍已经签入)时,不应更改延迟 它意味着如果它为零,它应该为零,但如果不是,则该值不应该变为零。

4 个答案:

答案 0 :(得分:1)

在这种情况下,你不可能想要什么,但是真的有必要计算Delay列吗?
你可以制作一个像下面这样的制作人,你可以在每次需要计算Delay时执行它(并且你也可以对每个id都使用if而不是特定的):

CREATE PROC CalculateDelay (@Id INT)
AS
BEGIN
UPDATE  dbo.Circulation
SET     [Delay] = ( DATEDIFF(minute, DATEADD(day, [Time], [StartDate]),
                         GETDATE()) )
WHERE   IsReturned = 0 
AND Id = @Id
END

答案 1 :(得分:0)

如果我理解你的要求,你想要一个计算列来更新某些时间,基于某些位,而不是基于另一位的其他时间。我不确定实现这一目标的最佳方法,但我认为您可以更轻松地解决您的问题。

而不是CheckIn,CheckOut和IsReturned标志/位,为什么不只是具有DateTime2 / DateTimeOffset和可空的CheckedInOn,CheckedOutOn和ReturnedOn字段。字段设置为相应操作发生时的当前日期和时间,否则为null。通过这种方式,您可以轻松地告知项目的状态(签入或签出),并且delta非常直接。

似乎Checked In和Returned可能是多余的,因为我觉得这本书在退回时会被检入,虽然我可能只是不理解你的白话。

答案 2 :(得分:0)

使用CASE语句,仅计算IsReturned = 0。 这是示例代码

SELECT  CASE 
          WHEN IsReturned = 0 THEN 
             (DATEDIFF(minute,DATEADD(day, [Time],[StartDate]),GETDATE()))
          ELSE 0
        END as Delay            
FROM  dbo.Circulation 
WHERE Id= @Id

http://msdn.microsoft.com/en-us/library/ms181765.aspx

答案 3 :(得分:0)

让我们制作一些测试数据:

DECLARE @Circulation TABLE
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Document_Id] [int] NULL,
    [Person_Id] [int] NULL,
    [Librarian_Id] [int] NULL,
    [StartDate] [datetime] NULL,
    [IsReturned] [bit] NULL,
    [EndDate]  AS ([StartDate]+[Time]),
    [LastUpdatedDate] DATETIME,
    [Time] [int] NULL,
    [Delay]  AS 
        (CASE WHEN [IsReturned] = 1 
         THEN DATEDIFF(minute,DATEADD(day, [Time],[StartDate]), LastUpdatedDate) 
         ELSE DATEDIFF(minute,DATEADD(day, [Time],[StartDate]), GETDATE()) 
         END)
)

我已经添加了一个新列LastUpdatedDate,它包含上次修改记录的时间,我们将在计算列DELAY中使用它来获取旧值。

INSERT INTO @Circulation
( Document_Id, Person_Id, Librarian_Id, StartDate, IsReturned, Time, LastUpdatedDate )
VALUES
( 1, 1, 1, '01/01/2014', 1, 30, '01/15/2014' ),
( 2, 1, 1, GETDATE(), 0, 30, GETDATE() );

SELECT
    Id,
    Document_Id,
    Person_Id,
    Librarian_Id,
    StartDate,
    IsReturned,
    EndDate,
    Time,
    Delay
FROM @Circulation

这是输出:

Id  Document_Id Person_Id   Librarian_Id    StartDate   IsReturned  EndDate Time    Delay
1   1   1   1   2014-01-01 00:00:00.000 0   2014-01-31 00:00:00.000 30  -30240
2   2   1   1   2015-01-05 10:10:54.627 1   2015-02-04 10:10:54.627 30  -43200