database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 4078 게시물 읽기
No. 4078
날짜와 관련된 질문
작성자
이상인(leewin0)
작성일
2008-02-27 12:13
조회수
4,584

안녕하세요 고수님들

검색을 해봐도 나오지 않길래 질문드립니다^^

a,b란 학생이 있습니다.
필드중에 date 란 필드에 각각 '2008-01-15', '2007-12-03'
그런대 이학생들이 월이 지나면서 
기준        입금일          이름
2007-12   2008-12-03      b
2008-01   2008-01-03      b
2008-01   2008-01-15      a
2008-02   2008-02-03      b
2008-02   2008-02-15      a
이런식으로 자동으로 출력해야합니다

어찌 방법이 없을까요?

이 글에 대한 댓글이 총 1건 있습니다.

입금일이 문자열 형식으로 되어 있다고 가정을 하였습니다 (보이는 형식대로..)
참고로, 입금일이 문자열이면 convert가 2번 일어나게 되므로 복잡해집니다.
날짜 형식으로 저장하심이 좋을 듯 합니다.
이름을 대신할 입금자 고유번호 등도 추가하셔야 결과가 명확합니다.

--// 테스트 시작 
-- 1) 테스트 테이블 생성
Create table A(
 기준 char(7),
 입금일 datetime,
 이름 varchar(10)
)

Create Clustered Index IX_receipt on A(입금일)
-- 2) 테스트 데이터 입력
truncate table A

insert into A
select '2007-12','2007-12-03','a'
union all
select '2007-12','2007-12-22','b'
union all
select '2007-12','2007-12-31','c'
union all
select '2007-12','2007-12-15','d'

--중간에 새로 insert 된 사람
insert into A
select '2008-02','2008-02-29','e'


-- 3) 데이터 확인 및 프로시저 생성 (매월 초에 자동으로 돌아가도록 스케줄러에 등록 => 이전 월 데이터를 생성하도록...)
select * from A

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

CREATE Procedure AutoCreateReceipt
  @this_month char(7) = null,
  @next_month char(7) = null 

AS
 Declare @start_date char(10)
 Declare @end_date char(10)

 if isnull(@this_month,'1')='1'
 begin  
  set @this_month = (select CONVERT(char(7),dateadd(month,-1,getdate()),126))
 end

 if isnull(@next_month,'1')='1'
 begin  
  set @next_month = (select CONVERT(char(7),getdate(),126))
 end 
 
 set @start_date = @this_month+'-01'
 set @end_date = @next_month+'-01'
 

 --// 데이터 입력 전에 이미 입력된 데이터 확인 및 삭제
 Delete From A
 where 기준 = @next_month
 
 --// 2월의 경우 28,29일 밖에 없으니 2월 이후로 입금일자가 틀려지므로, 그 전달과 비교하여 계산한다
 if right(@this_month,2)='02'
 begin
   Declare @Feb_month char(8)
   set @Feb_month = (select CONVERT(char(7),dateadd(month,-1,convert(datetime,@start_date)),126)+'%')
 
   insert into A  
   select @next_month, isnull(B.ReceiptDay, convert(char(10), dateadd(month,1,convert(datetime,A.입금일)),126)), A.이름
   from A
   left outer join ( -- 기존 입금자와 신규 입금자 구분
       select @next_month as Next_month, convert(char(10),dateadd(month,2,convert(datetime,입금일)),126) as ReceiptDay, 이름      
       from A
       where 입금일 like @Feb_month
     ) B
   on A.이름 = B.이름   
   where A.입금일 between @start_date and @end_date
 end
 -- 2월이 아닌 나머지는 전달 +1 하면 됨.
 
 else
 begin
  insert into A
  select @next_month, convert(char(10),dateadd(month,1,convert(datetime,입금일)),126), 이름
  from A
  where 입금일 between @start_date and @end_date
 end

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO


 


--// 4) 실행 
exec dbo.AutoCreateReceipt '2007-12' ,'2008-01'
exec dbo.AutoCreateReceipt 


<<<< 위의 방식으로 1월부터 4월까지 실행한 결과 >>>>>
기준      입금일        이름
------- ---------- ----------
2007-12 2007-12-03 a
2007-12 2007-12-22 b
2007-12 2007-12-31 c
2007-12 2007-12-15 d
2008-01 2008-01-03 a
2008-01 2008-01-22 b
2008-01 2008-01-31 c
2008-01 2008-01-15 d
2008-02 2008-02-03 a
2008-02 2008-02-22 b
2008-02 2008-02-29 c
2008-02 2008-02-15 d
2008-02 2008-02-10 e
2008-03 2008-03-03 a
2008-03 2008-03-22 b
2008-03 2008-03-31 c
2008-03 2008-03-15 d
2008-03 2008-03-10 e
2008-04 2008-04-03 a
2008-04 2008-04-22 b
2008-04 2008-04-30 c
2008-04 2008-04-15 d
2008-04 2008-04-10 e 
도때리아님이 2008-02-27 16:26에 작성한 댓글입니다.
이 댓글은 2008-02-27 17:34에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
4081저장프로시저 작성후에요~
김송희
2008-02-28
3359
4080현재시간 getdate() 를 얻어올 때 [2]
뾰로롱~
2008-02-27
4095
4079while문에서요~ [5]
김신희
2008-02-27
3828
4078날짜와 관련된 질문 [1]
이상인
2008-02-27
4584
4077BCP처리후 나오는 처리결과행 없앨 수 있나요?
my
2008-02-26
3456
4076저장프로시저 삭제시에요~ [4]
김신희
2008-02-26
4636
4075SP 생성하는데 없는 테이블을 입력했는데도.. [1]
최정윤
2008-02-22
3326
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다