Застрял с оператором SQL снова. Ошибка: «Неверное имя столбца» - PullRequest
1 голос
/ 16 июля 2011

Я пытаюсь заставить работать следующий оператор SQL-сервера, но я получаю эту ошибку: «Неверное имя столбца« bfg ».»

WITH valDiff AS (
 SELECT 

  CASE 
   WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
   ELSE DATEADD(second, 604800, [InTime]) 
  END AS bfg,

 datediff(second,
  CASE 
   WHEN [InTime] >= @in THEN [InTime]
   ELSE @in 
  END,
  CASE  
   WHEN bfg <= @out THEN bfg  
  ELSE @out 
 END) 

 AS v1 FROM [MyTable] 

 WHERE 
 AND [InTime] <= @out 
 AND  bfg >= @in

) SELECT SUM(v1) FROM valDiff;

В двух словах, первый CASE с DATEADD должен установить 'bfg' как минимум (OutTime, InTime + 7 дней). Вторая часть или DATEDIFF должны вычислять разницу во времени в секундах между полем InTime и вычисленным выше значением 'bfg', если они попадают в интервалы времени @in и @out.

Хотелось бы, чтобы я лучше знал SQL ..... Как вы это исправите?

1 Ответ

1 голос
/ 16 июля 2011

Вы не можете использовать псевдоним bfg после его создания в том же запросе. Сильная необходимость сделать это обычно означает необходимость выбросить код в предложение JOIN, чтобы вы могли ссылаться на него из псевдонима.

РЕШЕНИЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ

Это опция "Pretty". Присоединяйтесь к вашему столу снова.

SELECT 
  T2.bfg,
  datediff(second,
    CASE WHEN [InTime] >= @in THEN [InTime] ELSE @in END,
    CASE WHEN T2.bfg <= @out THEN T2.bfg ELSE @out END) 
  AS v1 
FROM 
  [MyTable] as T1
  inner join
  ( SELECT MyTableID,
     CASE 
      WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
      ELSE DATEADD(second, 604800, [InTime]) 
     END AS bfg
    FROM
     [MyTable]
  ) as T2 on T2.MyTableID = T1.MyTableID 
WHERE 
  [InTime] <= @out 
  AND  T2.bfg >= @in


Способ просмотра

Вы можете создать вид, а затем выбрать его.

Сделайте это один раз:

CREATE VIEW MyView as
SELECT
 CASE 
   WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
   ELSE DATEADD(second, 604800, [InTime]) 
  END AS bfg,
 *
FROM
 [MyTable]

Тогда ваши запросы будут выглядеть так:

WITH valDiff AS (
 SELECT 
  bfg,
  datediff(second,
   CASE 
    WHEN [InTime] >= @in THEN [InTime]
    ELSE @in 
   END,
   CASE  
    WHEN bfg <= @out THEN bfg  
   ELSE @out 
  END) AS v1 
FROM [MyView] 
WHERE 
 [InTime] <= @out 
 AND  bfg >= @in
) SELECT SUM(v1) FROM valDiff;


Гадкий Раствор

Это просто вопрос копирования копии вашего дела в 3 местоположения.

Вы должны заменить bfg в предложении WHERE (и других местах) следующим:

CASE 
 WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
 ELSE DATEADD(second, 604800, [InTime]) 
END

Так что весь ваш код будет выглядеть так:

WITH valDiff AS (
 SELECT 

  CASE 
   WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
   ELSE DATEADD(second, 604800, [InTime]) 
  END AS bfg,

 datediff(second,
  CASE 
   WHEN [InTime] >= @in THEN [InTime]
   ELSE @in 
  END,
  CASE  
   WHEN 
     CASE WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
     ELSE DATEADD(second, 604800, [InTime]) 
     END 
   <= @out THEN 
     CASE 
     WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
     ELSE DATEADD(second, 604800, [InTime]) 
     END
  ELSE @out 
 END) 

 AS v1 FROM [MyTable] 

 WHERE 
 [InTime] <= @out 
 AND  CASE 
   WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
   ELSE DATEADD(second, 604800, [InTime]) 
  END >= @in

) SELECT SUM(v1) FROM valDiff;
...