2017-02-22 1 views
0

직원이 회사에서 근무한 시간을 알아 내려고하고 있으며, 사임 날짜가 있습니다.varchar 값 '2 년 -2 개월 21 일'을 데이터 유형 int로 변환 할 때 변환이 실패했습니다.

하지만 지금은 데이터가 없습니다. 따라서 데이터베이스의이 열의 값이 Null입니다. 하지만 내 SQL에서 일이 일어 났을 때 고려 사임 날짜 대신 현재 시간 그러나 지금은 작업 시작 날짜와 현재 시간을 가져 가라. 내 이론은 열 사퇴 날짜가 null 인 경우 "현재 날짜 - 작업 시작 날짜"를 사용하고 그렇지 않으면 사임 날짜 - 작업 시작 날짜가되어야합니다.

나는이 이론에 대한 SQL 쿼리를 작성하고 그것을 잘 작동하지만거야 나는이 문제가있어 시간을 직원 작업을위한 전 년 월 일에 대한 보답을하려고 할 때 :

이) 나는이 오류의 고생을 시간 나는 또한 나는 그것의 변환해야하지만 그것이 내가 내 주요 쿼리를 실행할 때,이 오류가 너무 잘 작동하지 않는 생각, 그 라인을 변환하려고 :

> Msg 245, Level 16, State 1, Line 1 
> Conversion failed when converting the varchar value '2 year -2 month 21 day' to data type int. 

내 주요 질의는 다음과 같습니다

**--- sql for how long employees work with year month day ----** 
    CASE 
     WHEN Users.ResignationDate IS NOT NULL 
      THEN DATEDIFF(YEAR, WorkStartDate, ResignationDate) 
      ELSE CAST(DATEDIFF(yy, WorkStartDate, GETDATE()) AS varchar(4)) + ' year ' + 
       CAST(DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()) AS varchar(2)) + ' month ' + 
       CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()), DATEADD(yy, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate)), GETDATE()) AS varchar(2)) +' day' END as Ancinitet, 
     Paychecks.DepartmentName AS Afdelinger 
    FROM dbo.Paychecks INNER JOIN dbo.Users ON Users.Id=Paychecks.UserId 
WHERE Users.CustomerId=214 order by Users.FirstName; 
+0

나는 문제를 분리하는 쿼리를 단순화 제안했다. –

+0

나는 방금 쿼리를 편집했습니다. 제발 알 수 없다면 말해주세요. – RyaN

+0

왜 사안에 대해 다른 결과를 보여주고 있습니까? - 사퇴 날짜가 null이 아니고 datediff를 사용할 때, 월 및 일 출력. –

답변

1

case 표현식은 단일 값 및 단일 유형을 반환합니다. SQL Server는 두 가지 유형을 반환하며 SQL Server는 적절한 반환 유형을 정수로 결정합니다.

그냥 문자열로 캐스팅 :

(CASE WHEN Users.ResignationDate IS NOT NULL 
     THEN CAST(DATEDIFF(YEAR, WorkStartDate, ResignationDate) as VARCHAR(255)) 
     ELSE (CAST(DATEDIFF(year, WorkStartDate, GETDATE()) AS varchar(4)) +' year ' + 
      CAST(DATEDIFF(month, DATEADD(year, DATEDIFF(year, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()) AS varchar(2)) +' month ' + 
      CAST(DATEDIFF(day, DATEADD(month, DATEDIFF(month, DATEADD(year, DATEDIFF(year, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()), DATEADD(year, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate)), GETDATE()) AS varchar(2)) +' day' 
     ) 
END) as Ancinitet, 

내가 당신이 원하는 것을 할 수있는 더 좋은 방법이 생각한다. 그게 중요하다면 질문에 샘플 데이터와 원하는 결과를 문의하십시오.

+0

방금 ​​코드를 대체했는데 작성했지만 오류가 발생했습니다. 메시지 241, 레벨 16, 상태 1, Line 1 문자열에서 날짜 및/또는 시간을 변환 할 때 변환이 실패했습니다. – RyaN

+1

'WorkStartDate'의 데이터 유형은 무엇입니까? –

+0

데이터 유형은 datetime – RyaN

0

무엇이 문제입니까?

datediff(year, workStartDate, isNull(resignationDate, getDate())) 
+0

아무 것도 잘못하지 않았습니다. 전 단지 2 년 2 개월이 전처럼 내 모습을 보여주고 싶습니다. – RyaN

0

일주일에 항상 7 일이 있기 때문에 개월 대신 주를 사용하는 것이 좋습니다. 일반적으로 가까운 거리에있는 30 일간의 월을 사용할 수도 있지만, 한 부부가 휴가를 보낼 수 있습니다.

DECLARE @StartDate DATETIME = '20151115', 
     @EndDate DATETIME = GETDATE(); 

SELECT YearWeekDay = CONCAT(DATEDIFF(DAY, @StartDate, @EndDate)/365, ' year ', DATEDIFF(DAY, @StartDate, @EndDate) % 365/7, ' week ', 
           DATEDIFF(DAY, @StartDate, @EndDate) % 365 % 7, ' day' 
          ), 
     YearMonthDay = CONCAT(DATEDIFF(DAY, @StartDate, @EndDate)/365, ' year ', DATEDIFF(DAY, @StartDate, @EndDate) % 365/30, ' month ', 
           DATEDIFF(DAY, @StartDate, @EndDate) % 365 % 30, ' day ' 
          ), 
     YWDHMS = CONCAT(DATEDIFF(SECOND, @StartDate, @EndDate)/86400/365, 'y ', DATEDIFF(SECOND, @StartDate, @EndDate)/86400 % 365/7, 'w ', 
         DATEDIFF(SECOND, @StartDate, @EndDate)/86400 % 365 % 7, 'd ', DATEDIFF(SECOND, @StartDate, @EndDate) % 86400/3600, 'h ', 
         DATEDIFF(SECOND, @StartDate, @EndDate) % 3600/60, 'm ', DATEDIFF(SECOND, @StartDate, @EndDate) % 60, 's ' 
         ); 

출력 :

StartDate EndDate     YearWeekDay    YearMonthDay   YWDHMS 
2015-11-15 2017-02-22 15:11:34.123 1 year 14 week 2 day 1 year 3 month 10 day 1y 14w 2d 15h 11m 34s 
+0

@RyaN 귀하의 답변은 2015 년 11 월 15 일에 "2 년 -9 월 8 일"을 반환합니다. 그게 네가 원하는거야? 내 대답은 "1 년 3 개월 10 일"또는 "1 년 14 주 2 일"을 반환합니다. –

관련 문제