2013-07-15 1 views
0

오늘과 Employee hiredate 사이에 며칠이되는지 (누가 상관하지 않더라도) 동의해야합니다. 2012 년 7 월 1 일에 한 명의 직원이 고용하면 그 결과가 오늘 오후 7시 15 분/2013-07/1/2013, 즉 15 일이되는 날입니다. 나는 2012 년 고용을 필요로하지 않습니다.휴가 누적 기록에 올바른 일 가져 오기

나는 dateadd와 datediff로 놀았지만 정확한 결과를 얻지 못했습니다.

SELECT 
    Co Employee, 
    LastName, 
    FirstName, 
    dateadd(dd, DATEDIFF(dd,CURRENT_TIMESTAMP,0),HireDate) 
FROM dbo.PREH 

답변

1

이것은 약간 무차별 적 이었지만 아마도 효과가있는 것으로 보입니다. 아이디어는 hiredate에 몇 년을 추가 한 다음 현재 날짜와 비교하여 확인하는 것입니다. 이 클 경우, 하나의 적은 년을 사용

select (case when DATEADD(year, datediff(year, hiredate, getdate()), hiredate) < GETDATE() 
      then DATEDIFF(dd, DATEADD(year, datediff(year, hiredate, getdate()), hiredate), getdate()) 
      else DATEDIFF(dd, DATEADD(year, datediff(year, hiredate, getdate()) - 1, hiredate), getdate()) 
     end) 
from preh; 

문제는 yeardatediff() 올해의 경계가 범위로 ​​두 날짜 사이의 년 수가 아니라 교차되는 횟수를 반환한다는 것입니다. 따라서 2012-12-30과 2013-01-01 사이에 1 년이 있고 2012-01-01과 2013-12-31 사이에 1 년이 있습니다.

+0

정말 고마워요. 저를 위해 일하는. 하지만 당신이 말했듯이 나는 1 년을 넘어서 문제를 겪을지도 모릅니다. –

2

당신은 계수 분할 사용할 수 있습니다

SELECT DATEDIFF(DAY,'20120101',GETDATE())%365 

단점은 당신이 케이스 로직 처리 할 수 ​​격년으로 윤년에 동일한 치료를하고 있다는입니다. 코드에서

은 : 당신은 그냥 출력 포맷의 일환으로 매년 떨어지고있는 것처럼

SELECT 
    Co Employee, 
    LastName, 
    FirstName, 
    DATEDIFF(DAY,HireDate,GETDATE())%365 AS DaysThisYear 
FROM dbo.PREH 
+0

이렇게하면 매년 코드가 변경됩니다. 또한 모든 직원을 동일한 결과로 만듭니다. 각 직원의 고용 날짜에 따라 요일을 계산해야하며, 일년에 대해 신경 쓰지 마세요. –

+0

매년 코드를 변경해야하는 이유는 무엇입니까? –

0

소리가 난다. 서식이 기본 데이터에 영향을주지 않아야합니다. 당신의 튜플의 마지막 요소는해야한다 :

datediff(day, HireDate, getdate()) 

당신이 다운 스트림에 대한 서식을 데이터에 대한 연산을 수행하고 저장할 수 있습니다 그 방법, 그것은 필요한 때.

관련 문제