안녕하세요.
경력기간을 산출하는 쿼리를 작성중인데요.
SELECT
start, endsum(DATEDIFF(dd, CONVERT(CHAR(10),stat+'01' , 111) , CONVERT(CHAR(10),end+'28' , 111)))/30 AS term
와 같이 쿼리를 작성해서 기간을 구했는데
첫번째 행 end의 201208과 두번째행 stat의 201208이 중복이 되는데,
이와같이 중복된 기간을 빼는 방법이 있을까요?
start end term
-----------------------------------------------
201004 | 201208 | 29
201208 | 201302 | 7
-----------------------------------------------
감사합니다.
Comment 6
-
군고구마
2013.11.08 16:52
-
Deicide
2013.11.08 17:14
감사합니다.
제가 생각하는 것은 아래와 같이 조회를 하게 되면 36이 나오게 되는데 그 중에서 중복된 기간 201208의 1을 뺄 수 있는 방법을 물어 본것이였습니다. ^^;
제가 무성의 하게 질문을 올렸네요...
start end term
-----------------------------------------------
201004 | 201208 | 29
201208 | 201302 | 7
-----------------------------------------------
-
군고구마
2013.11.08 17:27
제가 답변한것이 궁금하신 부분이 맞으신건가요?^^
-
Deicide
2013.11.08 17:41
궁굼했던 부분은 중복된 월을 빼는 거 였습니다.
말씀해 주신 부분은 이해했습니다.
-
zom6ic
2013.11.08 18:47
급하신대로 ... -_-; 더 좋은 방법을 저에게도 알려주세요!
select a.*
into #A
from
(
select '201004' as start, '201208' as [end] union all
select '201208', '201302' union all
select '201303', '201311'
) aselect a.*
,datediff(month,a.start+'01',a.[end]+'01') + 1 as term
from
(
select a.start
,isnull(b.[end],a.[end]) as [end]
from
(
select a.*
from #A a
where a.start not in (select isnull(b.start,'')
from #A a
left join #A b on a.[end] = b.start)
) a
left join #A b on a.[end] = b.start
) adrop table #A
-----
201004 201302 35
201303 201311 9 -
건우아빠
2013.11.09 19:38
zom6ic 님은 한단계 더 들어가서 두개의 기간을 하나의 기간으로 해주는 쿼리네요..
with res as (
select * , ROW_NUMBER() over (order by start ) idx
from #A a )
select a.[start], a.[end]
, DATEDIFF( mm, a.[start]+'01' , a.[end] +'01') + (case when a.[end] = b.[start] then 0 else 1 end)
from res a left join res b on b.idx = a.idx + 1
위의 쿼리에서 만약에 start랑 end가 datetime이라면
안쪽에서는 이렇게 구해질 것 입니다.
select CONVERT(char(10),'2013-10-05 10:30:00.135'+'01',111)
데이터는 마음대로 넣었습니다.
제가 볼때 질문자 분의 의도는 2013-10-01로 맞추고자 했던거 같은데
이것을 실행해보면 2013-10-05로 나옵니다. convert로 char(10)까지 잘랐기 때문에 2013-10-05까지 밖에 안나 오는 것입니다.
그렇기 때문에 그 기간이 겹치는 것들은 중복이 될 수 밖에 없습니다.
제가 전체 쿼리를 보지 못해서 이것을 현재 올려주신 쿼리에서 문제를 바로 잡고자 하신다면
select CONVERT(char(8),'2013-10-05 10:30:00.135',111)+'01'
이렇게 하시면 될 것 같습니다.