2017-12-20 24 views
0

안녕하세요. 입국 일과 퇴근 일 사이에 매 3 일마다 업데이트해야하는 입국 일과 출발일이 포함 된 임시 직원 표가 있습니다. 여기 내 출력SQL은 매 3 일마다 업데이트됩니다.

output

내가 생각할 수있는 유일한 방법은 3의 배수와 DATEADD를 사용하는 것입니다 만, 도착과 출발 사이의 일 달 또는 몇 년이 될 수 있습니다, 그래서 세트 UPDATE 필요 며칠을 불문하고 3 일마다

UPDATE #Report SET "Service" = CASE 
    WHEN Date = DATEADD(DAY,3,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,6,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,9,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,12,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,15,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,18,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
    WHEN Date = DATEADD(DAY,21,CAST(FLOOR(CAST(Arr AS money)) AS Datetime)) THEN 'Full Service' 
... 
etc 
ELSE 'Restricted Service' END 

누구나 해결책을 생각해 낼 수 있습니까?

UPDATE #Report 
    SET Service = (CASE WHEN DATEDIFF(day, Arr, Date) % 3 = 0 
         THEN 'Full Service' 
         ELSE 'Restricted Service' 
        END); 

내가 money로의 전환이 쿼리의 버전에서 무엇을하고 있는지 추측 할 수 없습니다

답변

2

나는 이런 식으로 뭔가를 기대하는 것이다.

+0

감사합니다 원래 도착 날짜가 시간을 포함하지만 더 좋은 방법이 있으면 알려 주시기 바랍니다 (예 : 09:00:00) 내 "날짜"열은 자정으로 설정되어 있으므로 Arr을 돈으로 변환 한 다음 다시 00:00 : 00.000으로 반환하여 datetime으로 되돌려 놓았습니다. :) – Kate

+0

감사하지만 내 것보다 훨씬 낫습니다! – Kate

+0

@Kate. . . 'date'로 변환하면 시간 구성 요소를 제거 할 수 있습니다. –

0

내가 발견 한 하나 개의 솔루션 :

추가 된 소스 테이블에 순위

RANK() OVER (PARTITION BY RoomID ORDER BY Date) AS Ranking 

Divided rank by 3 

UPDATE #x SET Ranking2 = CAST(Ranking AS DECIMAL(20,2))/3 

Update only where this is a whole number 

UPDATE #Report SET "Service" = 
    CASE WHEN FS.Ranking2 = ROUND(FS.Ranking2, 0) THEN 'Full Service' 
    ELSE 'Restricted Service' END