我尝试case when
null
,not 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
但我需要输出(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'
答案 0 :(得分:0)
问题似乎是你的条件重叠&#34;。我的意思是说早期条件适用(在你的情况下:第一个),后面的条件也适用,但case
语句在第一个匹配时结束。
您需要做的是重新调整您的条件,以便他们唯一地识别每个案例。
您的第一个条件是ChkIn
不应该null
且ChkOut
不应该等于00:00:00
。虽然这种情况对于您期望结果为8
的行也是如此,但第一个&#34;匹配&#34;由case
语句应用。
修改强>
但是,我确实不太了解您的输出预期何时为0
以及预期为8
的要求。也许你可以进一步解释应该返回哪个值的确切条件。我很难理解ChkIn和ChkOut中的值得半天。我需要设置值= 8。
答案 1 :(得分: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应该应用于一行时,请更清楚地解释。