날짜 관련해서 질문드립니다. 년이 넘어가는 문제... 0 12 2,672

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

 

이렇게 셀렉트를 하고 싶은데 방법이 없을까요? ㅜㅜ

 

 

by 우리집아찌 [2019.01.08 16:58:28]
-- 제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
;


 


by 준일정 [2019.01.08 17:02:34]

음 어떤 의미인지는 모르겠네요;;;


by 우리집아찌 [2019.01.08 17:05:18]

행복제 SQL 입니다.

http://www.gurubee.net/article/55635


by 준일정 [2019.01.08 17:07:49]

프로시저로 구현하고 싶은데 방법이 없을까여?


by 우리집아찌 [2019.01.08 17:10:18]

그냥 SQL 이므로 편하게 날짜만 변수 처리하시면 됩니다.


by 마농 [2019.01.08 17:37:35]
WITH t AS
(
SELECT CAST('201809'+'01' AS DATE) dt
 UNION ALL
SELECT DATEADD(mm, 1, dt) dt
  FROM t
 WHERE dt < CAST('201905'+'01' AS DATE)
)
SELECT CONVERT(VARCHAR(6), dt, 112) ym
--     , FORMAT(dt, 'yyyyMM') ym    -- MSSQL2012 부터
  FROM t
;

 


by 준일정 [2019.01.09 09:32:44]

고민하다가 그냥 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


by 마농 [2019.01.09 09:42:54]

알려드린 방법이 안되서 프로시져로 한건가요?
쉬운 방법 알려드렸는데 왜 어렵게 하시나요?


by 준일정 [2019.01.09 11:00:15]

급해서요 ㅠㅠ 알려주신 방법도 좀 해보겠습니당.


by 준일정 [2019.01.09 11:28:12]

근데 커서 돌려야 하는데 그럴라면 제 방식으로 해야하지 않나요?


by 마농 [2019.01.09 11:42:20]

원하시는게 9건의 자료가 조회되면 되는거 아닌가요?
답변 드린 쿼리가 원하는 결과가 안나오나요?
커서를 사용해야 한다고 생각하는 이유가 뭔가요?
추가로. 더 쉬운 방법이 있습니다.
년월이 이미 저장된 테이블 하나 관리하세요.
해당 테이블 between 조건으로 조회하면 편리합니다.


by 준일정 [2019.01.09 13:03:03]

답변 감사드립니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입