我在this page问了我的问题,但没有解决。
我有一个名为Circulation
的表(在图书馆管理系统中。)
列名称: - IsReturned
,Delay
StartDate
,Time
和EndDate
我在此表格中保存了Checkin
和Checkout
这样的方式,即有一个名为IsReturned
的列,当图书结帐时它是equal
到{{1}当书籍返回库false
时,它等于checkin
。
我想计算结帐的延迟。
此表中的列是true
,StartDate
和Time
(计算列为" 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(书籍已经签入)时,不应更改延迟。 它意味着如果它为零,它应该为零,但如果不是,则该值不应该变为零。
答案 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
答案 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