2014-12-31 2 views
-3

Я задал свой вопрос в this page, но он не был разрешен.Как проверить какое-то условие на вычисленном столбце?

У меня есть таблица с именем Circulation Имя столбца (В библиотечной системе управления.): - IsReturned, DelayStartDate, Time и EndDate

Я сэкономить Checkin и Checkout в этой таблице таким образом, что существует столбец с именем IsReturned, который при оформлении книги составляет equal до false, а когда книга возвращается в библиотеку checkin, она равна true.

Я также хочу рассчитать задержку выписки.

Мой столбец в этой таблице: StartDate, Time и EndDate (вычисленный столбец «StartDate» + «Time»). Я хочу рассчитать задержку, пока документ не вернется. (до тех пор, пока столбец IsReturned не станет ложным) с использованием вычисленного столбца.

Мне нужно, чтобы столбец IsReturned был прав, значение столбца Delay не должно меняться, но если оно не должно обновляться.

Я использую приведенный ниже код, чтобы обновить столбец «Задержка», если IsReturned = 0, но как я могу изменить этот код на дон t change the delay value if the IsReturned = 1`.

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

Обновление:

Моя таблица такова:

ALTER TABLE [dbo].[Circulation](
[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]), 
[Time] [int] NULL, 
[Delay] AS (CASE WHEN [IsReturned] = 1 THEN ******* ELSE (DATEDIFF(minute,DATEADD(day, [Time],[StartDate]),GETDATE())) 

Я думаю, вы не понимаете мой стол еще. EndDate также является вычисленным столбцом, и это «StartDate + Time» (это время пришло из C# Program в минуту). Так что если в книге Checkedout из библиотеки StartDate и The EndDate есть значение, но IsReturned является ложным, а когда в книге Checkedin значение IsReturned равно true. Я хочу, чтобы вычислить столбец «Delay» от вычисляемого столбца, так что: 1. Когда IsReturned = 0 (книга была Выдана) Задержка должна вычислить по формуле:

(DATEDIFF(minute,DATEADD(day, [Time],[StartDate]),GETDATE()) 

2. Когда IsReturned = 1 (книга проверена) Задержка не должна изменяться. это означает, что если оно равно нулю, оно должно быть нулевым, но если нет, значение не должно меняться к нулю.

+0

Так Checkout фактический столбец? или текст столбца IsReturned? –

+0

Значение вычисленного столбца всегда вычисляется из значений, содержащихся в других столбцах. Таким образом, ваше требование * не изменять * значение этого столбца, если IsReturned = 1 противоречит самой природе вычисленного столбца. В вычисляемом столбце нет значения, кроме значения, которое вычисляется выражением. –

+0

@Pedram_Parsian: - во-первых, когда задавайте вопрос, включите все соответствующие детали, чтобы люди лучше поняли, что именно вы хотите, и что вы достигли до тех пор и где вы застряли? Лучше прочитайте это http://stackoverflow.com/help/how-to-ask – HaveNoDisplayName

ответ

1

В этом случае, это невозможно, что вы хотите, но это действительно необходимо, чтобы Delay столбец должен быть вычислен?
вы можете сделать производитель, как показано ниже, что вы можете выполнять его каждый раз, когда вам нужно вычислить Delay (А также вы можете использовать, если для каждого идентификатора не конкретного):

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 
0

Если я понимаю, что вы просите, вы хотите, чтобы вычисляемый столбец обновлял определенные моменты, основываясь на некоторых битах, но не в других случаях на основе другого бита. Я не совсем уверен, что лучший способ это сделать, но я думаю, что вы можете решить свою проблему более простым способом.

Вместо CheckIn, CheckOut и IsReturned flags/bits, почему бы просто не иметь поля CheckedInOn, CheckedOutOn и ReturnedOn, которые являются DateTime2/DateTimeOffset и имеют значение NULL. Поля установлены на текущую дату и время, когда соответствующее действие происходит и в противном случае имеет значение null. Таким образом, вы можете легко определить статус элемента (зарегистрированный или зарегистрированный), а дельта - прямолинейно.

Также кажется, что Checked In and Returned может быть излишним, поскольку мне кажется, что книга проверяется, когда она возвращается, хотя я могу просто не понимать ваш народный язык.

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

+0

Мне не нужно их обновлять. Я хочу создать вычисленный столбец «Задержка». –

+0

Я изменил ответ, используйте CASE – HaveNoDisplayName

+0

Спасибо, но я знаю эти коды. Я хочу 1. Используйте это в Вычисленной формуле не в выборе и 2. Если возвращается равно нулю, выберите последнюю задержку, а не ноль. –

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 
+0

Спасибо, но см. Обновление, чтобы больше узнать о моей таблице. –

+0

Хорошо, это была ваша таблица и вычисляемый столбец, я положил оператор else, чтобы сделать delay = 0 на данный момент, но реальный вопрос, который вы еще не объяснили, - это то, что вы хотите отложить, когда isreturned = 1. –

Смежные вопросы