bfg
同じクエリ内でエイリアスを作成した後は、エイリアスを使用できません。これを行う必要性が強いということは、通常、コードを JOIN 句に挿入して、エイリアスから参照できるようにする必要があることを意味します。
INNER JOIN ソリューション
これは「かなり」のオプションです。再びテーブルに参加します。
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
VIEW メソッド
ビューを作成してから、代わりに選択することができます。
これを 1 回実行します。
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;
醜い解決策
これは、Case Statement をコピーして 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;