2017-12-21 32 views
-1

일련의 조건에 대해 PayrollOID가 필요한 두 테이블 사이에 교차 조인이 있습니다. CASE 문, WHERE 절의 CASE 및 IIF 문에서이 작업을 시도했지만 일반 코드에서는 공백을 제거하기 위해 다른 패스를 수행해야합니다.SQL> = 및 <= IIF에서 또는 오류가 발생하는 곳

나는 승인 날짜를 기준으로 급여로가는 직업 승인을 받았습니다. 승인이 입력 된 날짜로 변경하고 있습니다. Apr_Entered이> = JobPayStart 및 Apr_Entered < = TimesheetsDue 및 JobEndDate> = JobPayStart 및 JobEndDate < = JobPayEnd 경우

- OID 말해 준다. 다른 것을 찾지 마십시오.

기타 - 저는 Apr_Entered가 JobPayStart 이상이고 Apr_Entered가 < = JobPayEnd 인 곳에서 급여를 받고 싶습니다.

오류가 발생했습니다. 함수 인수 목록에 오류가 있습니다. '>'을 (를) 인식 할 수 없습니다. 쿼리 텍스트를 구문 분석 할 수 없습니다.

하지만 실행됩니다. 그러나 두 괄호가 중첩 작업을 위해 표시되는 곳에서 중복을 얻고 있습니다.

내 북 엔드를 강화하는 데 도움이 필요합니다. 그래서 처음 발견되면 도움이 필요합니다. 나는 또한 왜 datetime 필드를 Date로 변환하여 비교할 때 오류가 발생하는지 알 필요가있다.

IIF(CONVERT(varchar(10), ProtoPayroll.AprEntered,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110) 
AND CONVERT(varchar(10), ProtoPayroll.AprEntered,110) <= CONVERT(varchar(10), PayDates.TimesheetsDue,110) 
AND CONVERT(varchar(10), ProtoPayroll.JobEndDate,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110) 
AND CONVERT(varchar(10), ProtoPayroll.JobEndDate,110) <= CONVERT(varchar(10), PayDates.PayEndDate,110), 
    --First IIF's result 
    CONVERT(nvarchar(40), dbo.Paydates.OID), 
    --Now another IIF 
    IIF (CONVERT(varchar(10), ProtoPayroll.AprEntered,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110) 
    AND CONVERT(varchar(10), ProtoPayroll.AprEntered,110) <= CONVERT(varchar(10), PayDates.PayEndDate,110), 
    --Second IIF's results 
    CONVERT(nvarchar(40), dbo.Paydates.OID), SPACE(40))) AS PayrollOID 
+2

왜'varchar'에 날짜를 (내가 가정)으로 변환된다 살펴 있나요? – Larnu

+0

문제를 재현하는 스크립트를 게시 할 수 없다면 누구도 확실하게이 질문에 대답 할 수 있다고 생각하지 않습니다. –

답변

0

이 추측 많은 작업은 여기에 있지만, SQL은 깔끔한 필요하다고. 나는 당신의 SQL에 잘못된 것을 볼 수 없다. "당연히"그러나 당신은 varchar으로 날짜를 가려서 문제를 제기하고있다. 예를 들어, varchar에서 '11/11/2016'이고, 이후는01/01/2018' 예, 그렇습니다. 이는 1> 0 (varchar의 첫 번째 문자가 먼저 정렬되고 두 번째 등이 사용되기 때문입니다.)

어쨌든 CASE 표현식을 대신 사용하여 SQL을 좀 더 세련된 버전으로 만들 수 있습니다. 분명히 이것은 완전히 테스트되지 않았습니다. 정말로해야 할 일은 샘플 데이터, DDL 및 예상 결과 세트를 게시하는 것입니다. 당신은 실제로 여기에 질문하지 않고, 당신의 목표를 말하고 오류를 얻는다 고 말하면됩니다 (우리는 복제 할 수 없습니다).

SELECT CASE WHEN PP.AprEntered >= PD.PayStartDate 
      AND PP.AprEntered <= PD.TimesheetsDue 
      AND PP.JobEndDate >= PD.PayStartDate 
      AND PP.JobEndDate <= PD.PayEndDate THEN CONVERT(nvarchar(40), PD.OID) 
      WHEN PP.AprEntered >= PD.PayStartDate 
      AND PP.AprEntered <= PD.PayEndDate THEN CONVERT(nvarchar(40), PD.OID) 
      ELSE SPACE(40) 
     END AS YourColumn 
FROM ProtoPayroll PP 
    JOIN PayDates PD ON --JOIN Criteria 
WHERE ...; 

이 당신에게 도움이되지 않습니다 경우, How to ask

+0

이것은 유효한 CASE 구문이 아닙니다. –

+0

@TabAlleman 네, 맞았습니다. 그러나 잘못 된 이유를 설명하는 것도 도움이됩니다. 단지 "이것이 잘못되었습니다"라고 말하는 것이 아닙니다. 나는 그 문제를 고쳤다. 그것은 초기의'WHEN' 초기에 빠져 있었다. – Larnu

+0

중첩 된 CASE 표현식을 사용할지 여부를 알 수 없기 때문에 정확히 무엇이 잘못되었는지 말할 수 없었습니다. –