0

我尝试case when使用nullnot null设置为值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|0
00006|2012-10-01 00:00:00.000|2012-10-01 13:50:00.000|2012-10-01 19:20:00.000|0

但我需要输出(错误代码)

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不应该也不null应该ChkOut等于00:00:00。虽然对于您期望结果为 的行,此条件也为真,但语句8应用了第一个“匹配” 。case

编辑
但是,我确实不太了解您对预期输出时间0和预期时间的要求8。也许您可以进一步解释应该返回哪个值的确切条件。我无法理解ChkIn 中的值,而 ChkOut 是半天。我需要设置值 = 8。

于 2012-11-27T08:11:13.977 回答
0

您必须在您的案例陈述中提供不会错误地返回 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?你如何定义全天和半天?如果没有某种经过时间计算,您将无法区分那些,而且我无法从您现有的查询中判断逻辑应该是什么。请更清楚地解释何时应将值 0、6、7 和 8 应用于一行。

于 2012-11-27T08:18:14.167 回答