1

次のSQLServerステートメントを機能させようとしていますが、「無効な列名'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;

簡単に言うと、DATEADDを使用する最初のCASEは、「bfg」をmin(OutTime、InTime + 7日)として設定する必要があります。2番目の部分またはDATEDIFFは、@ inおよび@outの時間枠内にある場合、InTimeフィールドと上記で計算された'bfg'との間の時間差を秒単位で計算する必要があります。

SQLをもっとよく知っていたらいいのに.....どうやって修正しますか?

4

1 に答える 1

1

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 つの場所に貼り付けるだけです。

bfgWHERE 句 (およびその他の場所) を次のように置き換える必要があります。

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;
于 2011-07-16T04:28:21.833 に答える