0

私は試しcase whenてみて、値フィールドnullに設定します。not nullErrorCode

元。

EmpNo|ChkDate                |ChkIn                  |ChkOut                 |ErrorCode
00001|2012-10-01 00:00:00.000|2012-10-01 07:21:00.000|2012-10-01 17:05:00.000|0
00002|2012-10-01 00:00:00.000|2012-10-01 22:17:00.000|2012-10-01 00:00:00.000|6
00003|2012-10-01 00:00:00.000|2012-10-01 00:00:00.000|2012-10-01 19:30:00.000|6
00004|2012-10-01 00:00:00.000|NULL                   |NULL                   |7
00005|2012-10-01 00:00:00.000|2012-10-01 07:10:00.000|2012-10-01 12:00:00.000|0
00006|2012-10-01 00:00:00.000|2012-10-01 13:50:00.000|2012-10-01 19:20:00.000|0

しかし、出力 (ErrorCode) が必要です

EmpNo|ChkDate                |ChkIn                  |ChkOut                 |ErrorCode
00001|2012-10-01 00:00:00.000|2012-10-01 07:21:00.000|2012-10-01 17:05:00.000|0
00002|2012-10-01 00:00:00.000|2012-10-01 22:17:00.000|2012-10-01 00:00:00.000|6
00003|2012-10-01 00:00:00.000|2012-10-01 00:00:00.000|2012-10-01 19:30:00.000|6
00004|2012-10-01 00:00:00.000|NULL                   |NULL                   |7
00005|2012-10-01 00:00:00.000|2012-10-01 07:10:00.000|2012-10-01 12:00:00.000|8
00006|2012-10-01 00:00:00.000|2012-10-01 13:50:00.000|2012-10-01 19:20:00.000|8

ChkIn および ChkOut で評価されるのは半日です。値を 8 に設定する必要がありますが、0 を試してみます。

このコード:

SELECT
   tf.EmpNo, tf.ChkDate, tf.ChkIn, tf.ChkOut,
   CASE
      WHEN ChkIn is not null and Convert(nvarchar(10), ChkOut,108) != '00:00:00'
         THEN 0
      WHEN ChkIn is not null and Convert(nvarchar(10) ,ChkOut,108) = '00:00:00'
         THEN 6
      WHEN Convert(nvarchar(10),ChkIn,108) = '00:00:00' and ChkOut is not null
         THEN 6
      WHEN Convert(nvarchar(10),ChkOut,108) <= '12:00:00'
         OR Convert(nvarchar(10),ChkOut,108) >= '12:00:01' Then 8
      WHEN ChkIn is null and ChkOut is null THEN 7 
   END as 'ErrorCode'
FROM filesTA tf
WHERE tf.ChkDate = '2012-10-01'
4

2 に答える 2

0

問題は、条件が「重複」していることです。つまり、初期の条件 (あなたの場合は最初の条件) が適用され、後の条件も適用されますが、caseステートメントは最初の一致で終了します。

必要なことは、条件を言い換えて、各ケースを一意に識別することです。

あなたの最初の条件は、 であってはChkInならず、nullChkOut等しくなるべきではないと言っています00:00:00。この条件は、結果が であると予想される行にも当てはまりますが、ステートメント8によって最初の「一致」が適用されます。case

EDITただし、出力がいつになると予想されるか、いつ
出力されると予想されるかについて、あなたの要件をよく理解していません。どの値が返されるべきか、正確な条件をもう少し詳しく説明できるかもしれません。ChkIn と ChkOut が半日であることが理解できません。設定値 = 8 が必要です。08

于 2012-11-27T08:11:13.977 に答える
0

case ステートメントの早い段階で、誤って true を返さない条件を提供する必要があります。8 の計算を前に移動する次のことを試すことができます。

SELECT
   tf.EmpNo, tf.ChkDate, tf.ChkIn, tf.ChkOut,
   CASE
      WHEN Convert(nvarchar(10),ChkOut,108) <= '12:00:00'
         OR Convert(nvarchar(10),ChkOut,108) >= '12:00:01' Then 8
      WHEN ChkIn is not null and Convert(nvarchar(10), ChkOut,108) != '00:00:00'
         THEN 0
      WHEN ChkIn is not null and Convert(nvarchar(10) ,ChkOut,108) = '00:00:00'
         THEN 6
      WHEN Convert(nvarchar(10),ChkIn,108) = '00:00:00' and ChkOut is not null
         THEN 6
      WHEN ChkIn is null and ChkOut is null THEN 7 
   END as 'ErrorCode'
FROM filesTA tf
WHERE tf.ChkDate = '2012-10-01'

しかし、これは 0 が表示されないようにするだけです。事実は、あなたの欲求が明確ではないということです。EmpNo 1 はコード 0 を取得するのに、EmpNo 5 と 6 はコード 8 を取得するのはなぜですか? 1日と半日をどのように定義していますか? なんらかの経過時間の計算がなければ、それらを区別することはできません。ロジックがどうあるべきか、既存のクエリからはわかりません。行に値 0、6、7、および 8 を適用する必要がある場合は、より明確に説明してください。

于 2012-11-27T08:18:14.167 に答える