2016-09-13 2 views
1

날짜에 따라 특정 코드를 설정할 수 있습니다.SQL Server : CASE date 종료일 30 일 전

오늘 날짜가 시작일과 종료일 사이에 하나가 "활성"입니다. 다른 하나는 종료일 30 일 전에 신청해야합니다.

나는 이런 식으로 시도했지만, 30 일전에 캐스팅하지 못했습니다. 도움을 주시면 감사하겠습니다.

예 :

DECLARE @now datetime = GETDATE() 

UPDATE table 
SET CODE = CASE 
       WHEN @now BETWEEN i.StartDATE AND i.EndDATE 
       THEN 'Active' 
       WHEN i.EndDATE <= DATEADD(day, -30, GETDATE()) 
       THEN 'Expiring' 
       ELSE 'Cancelled' 
      END 
+0

어떤 오류가 발생합니까? – dazedandconfused

+0

나는 당신의 상태가 잘못되었다고 생각합니다. 오늘이 만료일로부터 30 일 이내에 만료 될 경우 코드를 만료로 표시하려면'getdate()> = dateadd (day, -30, i.enddate)를 계산해야합니다. ' – Beth

+1

@Beth - 그렇지 않습니다. 비교 연산자를 작게보다는 작게 반대로 할 때 OP에있는 것과 똑같은가? – Igor

답변

0

당신은이 활성 상태를 encompases 그러나 그것을 superseeds으로 먼저 30 일 확인해야합니다. 또한 논리를 조금 더 읽기 쉽게하기 위해 DATEDIFF을 사용했습니다.

DECLARE @now datetime = GETDATE() 

UPDATE table 
SET CODE = CASE 
    -- its between the start/end dates AND falls within 30 days of the end date 
    WHEN @now BETWEEN i.StartDATE AND i.EndDATE AND DATEDIFF(day, @now, i.EndDATE) < 30 
    THEN 'Expiring' 
    -- else it falls between the start/end date 
    WHEN @now BETWEEN i.StartDATE AND i.EndDATE 
    THEN 'Active' 
    -- it falls outside the start/end dates 
    ELSE 'Cancelled' 
END 
+0

감사합니다.이 말이 맞습니다. 나는 이것을 시도해보고 그것이 효과가 있었는지 알려줄 것이다. – user3052850

+0

'만료'에 대한 첫 번째 조건이 필요하다고 생각하지 않습니다. 종료일과 현재 기간 사이에 30 일 이하가있는 경우 만료되었습니다. startDate가 유효한지 확인하기 위해 startDate를 테스트 할 필요가 있다고 생각하지 마십시오. 만료되지 않은 한 @now는 종료일 이전 (활성) 또는 이후 (취소됨)입니다. 시작일의 값에 ' 문제 없습니다. – Beth

+1

@Beth - 포함하지 않으면 올바른 조건에서 부정적인 결과가 발생할 수 있기 때문에 발생합니다. 예는 과거에 발생한 시간대입니다. IMO 시작일은 아마도 아직 발생하지 않았을 수 있으므로 중요 할 것입니다. 어떤 경우에는 기간이 활성 상태가 아니기 때문에 주정부가'취소됨 '으로 이어질 것이라고 추측합니다. 그러나 OP가 어떤 일이 일어나는지 지정하지 않았기 때문에 잘못된 가정이 될 수도 있습니다. 대본. – Igor

1

조건을 원하는대로 설정하는 데 문제가있는 경우 해당 조건을 단순화하고 SELECT 문에서 값을 확인하십시오. 그렇다면 비교를 설정하는 방법이 명확해야합니다.

DECLARE @now datetime = GETDATE() 

UPDATE table 
    SET CODE = CASE 
       when @now < i.startdate then 'future' -- or null 
       WHEN @now > i.EndDATE then 'Cancelled' 
       when @now >= DATEADD(day, -30, i.EndDATE) THEN 'Expiring' 
       else 'Active' 
      END 
where code is null or code <> 'Cancelled' 

이것은 행이 모두 활성화되어 있고 만료 될 때 만료되는 코드가 승리하기를 원한다고 가정합니다. 시작일이 종료일 전일 인 경우에도 활성화되고 만료되며 만료되기를 원합니다.

+0

나는 당신의 대답을 더 좋아한다. 삭제 된 광산 – dazedandconfused

+0

나는 이런 것들을 항상 뒤죽박죽이다. 이런 종류의 비교를하는 방법을 찾아내는 전략을 가지고있다. – Beth

+0

시작 날짜가 아직 발생하지 않았지만 이것이 고려되지 않은 이유는 무엇입니까? 아마 '올바르지 않은'결과가 나온다. 대체 솔루션을 사용하면'Cancelled' (* 역시 잘못된 것일 수 있지만 활성 상태보다 유효한 상태에 더 가깝습니다)가 발생합니다. – Igor