2013-05-14 2 views
0

안녕하세요, 이것이 간단한 수정이라고 확신하지만 해결할 수 없습니다. 완성 된 날짜 (CompleteDate-CurrentDate) (이 숫자는 음수가 될 것임)가 지나친 레코드에 대해 보고서의 "기한 초과"레이블을 지정하려고합니다. 또한 음수가 아닌 숫자로 레코드를 변경하지 않기를 바랍니다. 여기에 어떤 도움을 주시면 감사 크게 될 것이다 현재 나에게 NULL 항목 DATEDIFF 및 COUNT와 함께 CASE 함수 사용

Select CASE DATEDIFF(targetcompletedate, NOW()) 
     When count(*) <=0 then 'Overdue' 
    END 'Days Left', 

을주고있다 코드의 조각은 감사

입니다

답변

3

CASE의 두 가지 변종이 있습니다

  1. CASE 
        WHEN condition1 THEN result1 
        WHEN condition2 THEN result2 
        ... 
        ELSE result_else 
    END 
    
  2. CASE scalar_expression 
        WHEN value1 THEN result1 
        WHEN value2 THEN result2 
        ... 
        ELSE result_else 
    END 
    

특정 값과 비교하지 않고 범위와 비교하기 때문에 첫 번째 구문이어야합니다. 대신 쿼리는 실제로 두 번째 구문을 사용합니다. count(*)<=0 표현식은 부울로 평가 된 다음 암시 적으로 DATEDIFF 결과로 암시 된 형식으로 정수로 변환됩니다.

당신은 단지 첫 번째 구문을 사용하려면이 같은 필요

select case when targetcompletedate is null 
      then 'Not set' 
      when DATEDIFF(targetcompletedate, NOW()) <= 0 
      then 'Overdue'     
      else DATEDIFF(targetcompletedate, NOW()) 
     end as 'Days Left' 
+0

이것은 여전히 ​​NULL을 반환합니다 –

+0

는'targetcompletedate' 가끔 null입니다? 나는 나의 대답을 업데이트했다. –

2

난 당신이 제거 할 것을 제안을 datediff() 완전히 :

Select (CASE when targetcompletedate <= NOW() the 'Overdue' else 'Days Left' end) 

당신이 숫자로 일을 표시 할 경우, 그런 다음 datediff()을 원합니다. 아마도,

select (case when targetcompletedate <= NOW() then 'Overdue' 
       else cast(DATEDIFF(targetcompletedate, NOW()) as varchar(255)) 
     end) 

을 또는 : 명확하게하기 위해, 내가 명시 적으로 문자열로 변환 할

select (case when targetcompletedate <= NOW() then 'Overdue' 
       else concat(DATEDIFF(targetcompletedate, NOW()), ' days left') 
     end) 

철학의 존재는 : 무엇을 표현하는 간단하고 명확한 방법이 있는지 기능을 사용하지 않는 네가 원해.

select sum(case when targetcompletedate <= NOW() then 1 else 0 end) as NumOverdue, 
     sum(case when targetcompletedate <= NOW() then 0 else 1 end) as NumWithDaysLeft 
+0

이것은 훌륭하지만 다른 레코드가 "Days Left"가 아닌 숫자로 표시되도록 할 필요가 있습니까? –

-1

그냥이 코드를보십시오 : 당신이 각 그룹의 수를 계산하려면

그러나, 나는 궁금

SELECT 
    CASE 
     WHEN datediff(dd,targetcompletedate,now()) <= 0 THEN 'Overdue' 
     WHEN datediff(dd,targetcompletedate,now()) > 0 THEN 'Days_left' 
    ELSE NULL END, 
    datediff(dd,targetcompletedate,now()) AS 'days' 
FROM tablename 

출력은 같은 것입니다 :

연체 -23

Days_left 13