Где я должен поместить блоки IF в этой команде SQL - PullRequest
0 голосов
/ 31 октября 2011

У меня есть следующий SQL:

DECLARE @ActualFromDT DATETIME,
        @ActualToDT DATETIME

IF (ManPowerUsage.FromDT >= Shift.FromDT)
    SET @ActualFromDT = ManPowerUsage.FromDT
ELSE
    SET @ActualFromDT =  Shift.FromDT

IF (ManPowerUsage.ToDT <= Shift.ToDT)
    SET @ActualToDT = ManPowerUsage.ToDT
ELSE
    SET @ActualToDT =  Shift.ToDT

SELECT Shift.ShiftID,
       Line.Line,
       ( SELECT SUM(DATEDIFF(MINUTE, @ActualFromDT, @ActualToDT))
              / DATEDIFF(MINUTE, Shift.FromDT, Shift.ToDT)

         FROM   ManPowerUsage

         WHERE  ManPowerUsage.LineID = Line.LineID
            AND ((Shift.FromDT < ManPowerUsage.FromDT AND Shift.ToDT > ManPowerUsage.FromDT) 
              OR (Shift.FromDT < ManPowerUsage.ToDT   AND Shift.ToDT > ManPowerUsage.ToDT  ))
            AND ManPowerUsage.IsEdited = 0
       ) AS ActualManpower
FROM ......

команда, очевидно, не работает, но я хотел бы знать, как мне настроить параметры перед тем, как выполнить DATEDIFF s

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Nowhere.Вы используете CASE выражение для «встроенного IF»

SELECT Shift.ShiftID,
   Line.Line,
   ( SELECT SUM(DATEDIFF(MINUTE,
               CASE
                  WHEN ManPowerUsage.FromDT >= Shift.FromDT
                         THEN ManPowerUsage.FromDT
                  ELSE Shift.FromDT
               END,
               CASE
                  WHEN ManPowerUsage.ToDT <= Shift.ToDT
                         THEN ManPowerUsage.ToDT
                  ELSE Shift.ToDT 
               END))
          / DATEDIFF(MINUTE, Shift.FromDT, Shift.ToDT)
...
0 голосов
/ 31 октября 2011

Вам не нужны переменные, что-то вроде этого должно сработать.Хотя фрагмент SQL нельзя проверить без полной выборки схемы.

SELECT 
Shift.ShiftID, 
Line.Line, 
( SELECT SUM
    (
        DATEDIFF
        (
            MINUTE, 
            case when mpu.FromDT>Shift.FromDt then mpu.FromDT else Shift.FromDt end, 
            case when mpu.ToDT<=Shift.ToDt then mpu.ToDT else Shift.ToDt end
        )
    ) 
  / DATEDIFF(MINUTE, Shift.FromDT, Shift.ToDT) 
 FROM   ManPowerUsage mpu
 WHERE  mpu.LineID = Line.LineID 
 AND (
    (   Shift.FromDT < mpu.FromDT 
        AND Shift.ToDT > mpu.FromDT
    )  
    OR (    Shift.FromDT < mpu.ToDT   
            AND Shift.ToDT > mpu.ToDT  
        )
    )
 AND mpu.IsEdited = 0 
 ) AS ActualManpower 

ОТ ......

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...