2011.06.03 00:39

SQL Unplugged : 300

오랫만에 MS 세미나에 다녀 왔습니다. 그 동안 MS 주관의 세미나가 없었던 것은 아니지만, windows 7 이후 관심가는 내용도 없었고  이래 저래 치이면서 살다 보니... 방문자 없는 쓸쓸한 블로그긴 해도 글쓰기 연습삼아 꾸준히타이핑질 하던 것도 잠시 멈출 정도로 피폐한 생활의 연속이었던것 같습니다. 어쨌거나 오랫만에 쓰는 글이 어색한 신세 타령이 되는건 싫으니 이쯤에서 멈추고...

MS 세미나는 그 주체가 MS 다 보니 이래 저래 MS 제품 이야기가 중심이 되는건 사실이고 또 그 제품에 대한 정보를 얻기 위해 참석하는 경우도 많았으니 제품 중심의 세미나가 된다고 해도 그다지 나쁘진 않았습니다. 다만 전에 MVP 서밋 참석 기회가 있었던 나로써는 외국에서 진행하는 세미나 또는 IT 관련 행사들이 MS 에서 진행한다고 해도 그리 딱딱하지만은 않고 재밌게 진행한다고(뭐 제대로 못알아듣고 그렇게 느끼는 것일 수도 ㅋㅋㅋ) 생각했었습니다. 그 중 가장 인상 깊었던 것은  청중들에 20가지 정도의 질문을 받아서 질의 응대와 라이브 데모를 진행하던 것이었습니다. 오늘 한국에서도 그런 자유로운 즐거운 느낌의 세미나를 보게 될 줄이야... 

 넓은 무대와 진행을 맡아 주신 김정선씨 객원들의 가식 없는 이야기들... 뭐 하나 빠지지 않는 즐거움이었습니다. SQL 쪽으론 이미 유명한 하성희(에이디컨설팅 대표), 정원혁(SQL路 대표), 김정선(SQL路 수석) 등 쟁쟁한 분들과 더블어 약간은 서먹한 느낌의 여러 회사 현업 담당자들까지 즐거운 시간이었습니다. 서먹한 느낌이 든다고 해서 그 시간까지 어색했던 건 아닙니다. 오히려 여러 회사 현업 담당자의 진솔이 이야기로 인해서 내가 느끼는 현실의 문제들이 나만의 문제가 아니었음을 또 내가 격었던 기술적 어려움이 나만의 문제가 아니었음을 잘 알게 해준 좋은 시간이었습니다.

앞으로도 이런 재밌는 세미나가 자주 열렸으면 좋겠습니다. 정말 재밌는 시가이었습니다. ㅋㅋㅋ 
저작자 표시
신고
이 장소를 Daum지도에서 확인해보세요.
서울특별시 강남구 논현2동 | 건설회관
도움말 Daum 지도

'뭐하는데 > 디비 디비 딥' 카테고리의 다른 글

SQL 에서 비트연산을 사용하자.  (0) 2012.06.08
SQL Unplugged : 300  (0) 2011.06.03
SQL 에서 영업일 계산하기  (0) 2011.04.01
stored Procedure 검색  (0) 2010.04.09
SQL 서버명 변경  (0) 2009.07.31
OPEN XML 문서  (0) 2009.05.07
Trackback 0 Comment 0
2011.04.01 15:35

SQL 에서 영업일 계산하기


참 오랫만에 딸깍딸깍 키보드 두두려 보는 것 같다. Filco 갈축이라는데 또각딸깔 소리가 참 좋네... 이래서 기계식 기계식 하나보다. 어쨌거나 오랫만에 나름 재밌는 작업을 한것 같아 간단히 정리해본다.

SQL 이 여러가지 장점에도 불구하고 총무팀 엑셀 잘하는 김대리 같은 사람들과 어울리면 영 짜증 스런 일이 많이 발생하곤 한다. 엑셀에서 영업일 구하는건 쉬운일이니 그냥 니들이 알아서 만들라고 하면 뭐 어쩌고 저쩌고 통계쿼리에서 처리해 달라거나 기타 등등의 귀찮은 이야기를 한다. 오늘도 그 귀찮은 이야기 중에 하나가 영업일 구하는 것이다. 발생일자로 부터 n영업일 이후 에 처리되는 기타 등등에 대한 이야기인데, 기본적으로 SQL에서는  DateAdd 라는 간단한 함수만 지원이 되는 관계로 주말을 제외한 영업일 구하는게 그리 쉬운 문제는 아니더라는 점이다. 특정일자로 부터 n 영어일 이후의 날짜를 구하는 함수를 만들어 봤다. 엑셀에서는 "=WORKDAY(DATE(2011,4,0.4),8)" 처럼 간단히 영업일이 구해진다.

자 이제 dateAdd  만 지원하는  쿼리에서는 어떻게 해야 할까... SQL 2008 기준입니다. date 와 같은 생소한 데이타 타입이 있습니다. 이전 버젼에서의 호환성 여부는 체크하지 못했습니다.

그나마 다행인게 datepart 라는 함수를 이용해서 요일정보는 읽어 올수 있다. 일요일이 1, 토요일이 7 이다.
먼저 지정한 날짜와 n 영업일을 위한 변수를 준비하고

Declare @interval int, @startDate date
set @startDate = '2011-03-28'
set @interval = 8

일요일, 토요일을 건너 뛰도록 간단한 if 문을 넣어 주자.

if datepart(dw, dateAdd(dd, @cCnt, @startDate)) > 1 AND datepart(dw, dateAdd(dd, @cCnt, @startDate)) < 7

지정한 영업일을 세기 위한 변수와 반복 회수를 정하는 변수를 만들어 주자

Declare @rCnt int, @cCnt int
SET @rCnt = 1
SET @cCnt = 1

지정한 영업일보다 작은 동안 돌 수 있도록 반복문으로 감싸 주면 끝...

while @interval > @rCnt

모든게 포함된 결과를 보도록 하자.

Declare @interval int, @startDate date
set @startDate = '2011-03-28'
set @interval = 8

Declare @rCnt int, @cCnt int
SET @rCnt = 1
SET @cCnt = 1

while @interval > @rCnt
 Begin
 if datepart(dw, dateAdd(dd, @cCnt, @startDate)) > 1 AND datepart(dw, dateAdd(dd, @cCnt, @startDate)) < 7
  Begin
  select dateAdd(dd, @cCnt, @startDate)
  SET @rCnt = @rCnt + 1
  End
 SET @cCnt = @cCnt + 1
 End
 
select dateAdd(dd, @cCnt, @startDate), @cCnt, @rCnt

-- 파란색  select 문은 잘 되는지 확인하기 위한 코드니 나중에 없애도록 하자.
그런데 지금 만든 것은 단순히 토요일, 일요일만 제외 시키는 것이므로 꿀같은 공휴일은 계산에서 빠진 상태다. 쩝.
어떤 방법을 이용하더라도 공휴일을 따로 계산해낼 방법이 없으므로 공휴일이 표시되는 달력 테이블이 하나 필요하다. 날짜와 공휴일 여부만 체크하도록 추가했다.
CalendarDate 의 데이타 타입을 주목해 주세요... 저는 시간이 필요 없었습니다. SQL  어떤 버전부터 지원되는 것인지 정확히 모르겠지만, 저는 2008 을 사용합니다.

CREATE TABLE [dbo].[Calendar](
 [CalendarDate] [date] NOT NULL,
 [Holiday] [int] NOT NULL,
 CONSTRAINT [PK_Calendar] PRIMARY KEY CLUSTERED
(
 [CalendarDate] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

날짜 채우기 위해서  while 문을 살짝 돌려 본다. 넣고 싶은 날짜 만큼 반복 카운트를 늘려주면 된다. 1년이 365일 이니까... 필요한 년도만큼...^^
declare @cnt int
SET @cnt = -300

while @cnt < 1000
 Begin
 INSERT INTO Calendar VALUES (DateAdd(dd, @cnt, getdate()), 0)
 SET @cnt = @cnt + 1
 End

날짜를 채웠으니 휴일을 정의해 줘야 겠죠. 일단 책상 위의 달력에서 얻을 수 있는 정보는 이정도 밖에 없으니 귀찮지만 내년 달력이 나오는 시점에 맞춰서 또 뭔가를 해야 겠군요...ㅋㅋㅋ

update Calendar SET holiday = 1
WHERE CalendarDate IN (
'2011-01-01'
,'2011-02-02'
,'2011-02-03'
,'2011-02-04'
,'2011-03-01'
,'2011-05-05'
,'2011-05-10'
,'2011-06-06'
,'2011-08-15'
,'2011-09-11'
,'2011-09-12'
,'2011-10-03'
,'2011-12-25'
,'2012-01-01'
,'2012-01-22'
,'2012-01-23'
,'2012-01-24'
)
이제 휴일에 대한 처리를 넣어 보죠...저는 임시테이블을 사용하는 방법으로 했습니다.
SELECT * INTO #tblCalendar FROM Calendar with(nolock) WHERE calendarDate > @startDate AND calendarDate < DateAdd(dd, @interval*2, @startDate)

영업일이라는게 7일 주 2일이 빠지는 것이니 임시테이블에 넣을 정보도 그렇게 많이 필요하진 않겠죠 그래도 여유있@interval*2 해서 두배의 날짜를 넣었습니다.ㅋㅋㅋ
그리고  if 문에 조건 추가
AND exists(SELECT CalendarDate FROM #tblCalendar WHERE CalendarDate = dateAdd(dd, @cCnt, @startDate) AND Holiday = 0)

전체 코드의 모습입니다. 이 코드의 내용을 기반으로 간단한 함수를 만들면 작업 끝... 사용자 정의 함수는 직접 만들어 보세요...
Declare @interval int, @startDate date
set @startDate = '2011-03-28'
set @interval = 8

Declare @rCnt int, @cCnt int
SET @rCnt = 1
SET @cCnt = 1


SELECT * INTO #tblCalendar FROM Calendar with(nolock) WHERE calendarDate > @startDate AND calendarDate < DateAdd(dd, @interval*2, @startDate)

while @interval > @rCnt
 Begin
 if datepart(dw, dateAdd(dd, @cCnt, @startDate)) > 1 AND datepart(dw, dateAdd(dd, @cCnt, @startDate)) < 7
  AND exists(SELECT CalendarDate FROM #tblCalendar WHERE CalendarDate = dateAdd(dd, @cCnt, @startDate) AND Holiday = 0)
  Begin
  SET @rCnt = @rCnt + 1
  End
 SET @cCnt = @cCnt + 1
 End
 
select dateAdd(dd, @cCnt, @startDate), @cCnt, @rCnt


저작자 표시
신고

'뭐하는데 > 디비 디비 딥' 카테고리의 다른 글

SQL 에서 비트연산을 사용하자.  (0) 2012.06.08
SQL Unplugged : 300  (0) 2011.06.03
SQL 에서 영업일 계산하기  (0) 2011.04.01
stored Procedure 검색  (0) 2010.04.09
SQL 서버명 변경  (0) 2009.07.31
OPEN XML 문서  (0) 2009.05.07
Trackback 0 Comment 0
2009.07.31 09:17

SQL 서버명 변경


SQL 복제 구성을 하려고 하는데 젠장...
SQL Server replication requires the actual server name to make a connection to the server. Connections through a server alias, IP address, or any other alternate name are not supported. Specify the actual server name, 'oldSQLServerName', (Replication.Utilities)
이런 메시지와 함께 어울리지 않는 에러를 내는데...아무리 봐도 서버명은 맞게 줬는데도 이런 어처구니 없는 일을 벌이고 있다. 컴퓨터 이름을 바꾼 경우도 마찬가지겠고 뭐 기타 등등...의 사유로 인해서 보이는 연결은 이상이 없는데 이름을 못찾는 경우가 생기게 된다. 아래와 같이 SQL 이 가지고 있던 서버의 이름을 고쳐주도록 하자...

USE master
GO

-- 예전 서버 이름을 확인한다.
SELECT @@SERVERNAME

-- 예전 서버 이름을 버린다.
EXEC sp_dropserver '버리려는서버이름', 'droplogins'
GO

-- 새 서버 이름을 등록한다.
EXEC sp_addserver '새로운서버명', 'local'
GO


그리고 나서 SQL 서버를 재 시작 해주어야 한다... 재시작 하기 전까지는 이전 이름을 그대로 물고 있다는
Configuration Manager 에서 잠시 멈췄다 다시 시작해주면 비교적 편하다.

저작자 표시
신고

'뭐하는데 > 디비 디비 딥' 카테고리의 다른 글

SQL Unplugged : 300  (0) 2011.06.03
SQL 에서 영업일 계산하기  (0) 2011.04.01
stored Procedure 검색  (0) 2010.04.09
SQL 서버명 변경  (0) 2009.07.31
OPEN XML 문서  (0) 2009.05.07
SQL 계정이 locked out 이라면  (0) 2009.05.06
Trackback 0 Comment 0
2009.03.18 09:29

sql 2008


"변경 내용을 저장 할수 없습니다. 변경 내뇽을 적용하려면 다음 테이블을 삭제 하고 다시 만들어야 합니다. 다시 만들 수 없는

테이블을 변경 했거나 [테이블을 다시 만들어야 하는 변경 내용 저장 사용 안함 ] 옵션을 설정 했습니다."



SQL 2008 management studio 를 사용하면서 이미 만들어진 테이블의 컬럼을 추가한다거나(not null로) 컬럼의 순서를 바꾼다거나 id 값을 세팅한다거나 기타 등등의 경우 위 메시지를 자주 보았을 것이다. 메시지 내용에서도 알겠지만, "테이블을 다시 만들어야 하는 변경 내용 저장 사용 안함" 만 해제 하면 되는데 그게 어디있는지 알수가 있어야지....ㅋㅋㅋㅋ  메뉴바 > 도구 > 옵션 을 클릭하면 아래 그림과 같은 대화창이 나타나고 아래 그림에 표시된 내용와 같이 찾아가면 그 설정을 조정할 수 있다.

신고

'뭐하는데 > 이따위로 만든다' 카테고리의 다른 글

xml 출력하기  (0) 2009.04.08
xml 로 받은 레코드 셋 어떻게 처리하나.  (0) 2009.04.06
sql 2008  (0) 2009.03.18
xslt 문서 변환  (0) 2009.03.12
오랫만에 다시 하는 ASP  (0) 2009.03.09
2014,,,sf 소설같은 숫자네요...xp 지원 년한 입니다.  (0) 2008.06.20
Trackback 0 Comment 0