by 준일정 [SQL Query] mssql sql oracle mysql [2019.01.08 16:47:28]
일단 사용하는 db는 mssql이구요
예를들어 이런겁니다.
201809 ~ 201905 라는 파라메터를 받아서
201809
201810
201811
201812
201901
201902
201903
201904
201905
이렇게 셀렉트를 하고 싶은데 방법이 없을까요? ㅜㅜ
-- 제PC 설치된것이 2008버전이라 FORMAT이 안되네요. 사용하시려면 밑에 참조. -- https://docs.microsoft.com/ko-kr/sql/t-sql/functions/format-transact-sql?view=sql-server-2017 WITH T AS ( SELECT 1 lv UNION ALL SELECT lv + 1 lv FROM t WHERE lv + 1 <= ( SELECT DATEDIFF(MM,CONVERT(DATE,'201809'+'01'),CONVERT(DATE,'201905'+'01')) + 1 ) ) SELECT CONVERT(VARCHAR(6),DATEADD(MM,LV-1,CONVERT(DATE,'201809'+'01')),112) FROM T ;
고민하다가 그냥 temp 테이블만들어서 프로시저로 해결 했는데 좋은 방법인지는 모르겠네요
--연월 파라메터를 받은 후 +01 해준다.
declare @startMonth varchar(8) set @startMonth='20181201'
declare @endMonth varchar(8) set @endMonth='20190301'
-- 시작 월을 -1 해준다 ex) 20180201 -> 20180101
select @startMonth= convert(varchar(8),dateadd(month,-1,@startMonth),112)
declare @zero int set @zero=1
declare @number int
--시작월과 종료월의 차를 변수에 넣는다.
select @number = datediff(Month,@startMonth , @endMonth)
--두 월 사이의 값을 temp테이블에 저장하기 위해템프 테이블 생성
create table #monthInfo(
monthinfo varchar(6)
)
--반복문으로 돌려 두 월 사이의 값을 구하여 템프 테이블에 저장한다.
--ex) 20180101 ~ 20180301 -> 20180101 , 20180201, 20180301
while(@zero<=@number)
begin
insert into #monthInfo values(convert(varchar(6),dateadd(month,@zero,@startMonth),112))
set @zero = @zero+1
end
select
*
from #monthInfo