Вы не можете использовать псевдоним 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;