반응형
-- 테이블에 존재하던 기존 PK 삭제
ALTER TABLE dbo.myTableName DROP CONSTRAINT dbo.myTableName.pkName

-- 테이블에 새로운 PK추가
ALTER TABLE dbo.myTableName ADD CONSTRAINT dbo.myTableName.pkNewName PRIMARY KEY CLUSTERED (
    [col1] ASC,
    [col2] ASC,
    [col3] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]
 
반응형
반응형
-- column add
ALTER TABLE 테이블명 ADD 추가할컬럼명 데이터타입(데이터크기) 컬럼속성 

EX)
ALTER TABLE EMP ADD DT_ENTER NVARCHAR(8) (NOT)NULL (DEFAULT (VALUE))

-- column modify
ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 데이터타입(데이터크기) 컬럼속성

EX)
ALTER TABLE EMP ALTER COLUMN DT_ENTER NVARCHAR(8) NOT NULL DEFAULT('20210101')

-- column delete
ALTER TABLE 테이블명 DROP COLUMN 컬럼명

EX)
ALTER TABLE EMP DROP DT_ENTER
반응형
반응형

MS-SQL에서 임시 테이블을 사용하여 쿼리를 짜고, 실행할 때..

 

'데이터베이스에 '#TEMP'(이)라는 개체가 이미 있습니다.' 에러가 뜨는 경우가 빈번하게 발생한다.

다시 실행시키면 에러없이 수행되지만 에러 메시지를 보기 싫은 경우

 

임시 테이블 생성하기 전에 아래 코드를 작성해주면 에러 없이 실행된다.

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
BEGIN
       DROP TABLE #Temp
END

 

반응형
반응형

월요일을 주의 시작 요일로 설정을 하고..

 

해당 월 1주 차, 2주 차, 3주 차, 4주 차, 5주 차, 6주 차별 시작일자 종료일자를 구하는 쿼리는 아래와 같다.

(6주 차까지 설정한 이유는 2020년 8월처럼 6주까지 있는 달이 있기 때문에..)

	DECLARE	@V_DT	NVARCHAR(8) = '20201201'	-- 기준년월

	-- 각 주차별 시작일 종료일을 담을 변수
	DECLARE	@V_DT_START_FIRST	NVARCHAR(8),
			@V_DT_END_FIRST		NVARCHAR(8),
			@V_DT_START_SECOND	NVARCHAR(8),
			@V_DT_END_SECOND	NVARCHAR(8),
			@V_DT_START_THIRD	NVARCHAR(8),
			@V_DT_END_THIRD		NVARCHAR(8),
			@V_DT_START_FOURTH	NVARCHAR(8),
			@V_DT_END_FOURTH	NVARCHAR(8),
			@V_DT_START_FIFTH	NVARCHAR(8),
			@V_DT_END_FIFTH		NVARCHAR(8),
			@V_DT_START_SIXTH	NVARCHAR(8),
			@V_DT_END_SIXTH		NVARCHAR(8)

	-- 해당월 1일의 요일을 구한다.
	DECLARE	@V_DT_WEEK	NVARCHAR(10) = DATENAME(WEEKDAY, @V_DT)

	-- 월요일 기준일자 셋팅
	-- 기준요일이 월요일이 아니라면 마지막 숫자를 바꿔주기
	-- 일요일은:-1 / 월요일:0 / 화요일:1 / 수요일:2 / 목요일:3 / 금요일:4 / 토요일:5
	DECLARE	@V_STD_DATE	DATE = DATEADD(WK, DATEDIFF(WK,0, DATEADD(DD,7 -DATEPART(DAY,@V_DT),@V_DT)), 0)

	-- 1주차 시작일, 종료일
	SET @V_DT_START_FIRST = @V_DT							
	SET @V_DT_END_FIRST = CONVERT(NVARCHAR(8), DATEADD(DAY, -1, @V_STD_DATE), 112)	-- 월요일 기준일자 -1일
	
	-- 2주차 시작일, 종료일
	SET @V_DT_START_SECOND = CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FIRST), 112)	-- 월요일 기준일자
	SET @V_DT_END_SECOND = CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_SECOND), 112)	-- 2주차 시작일의 6일 더하기
	
	-- 3주차 시작일, 종료일
	SET @V_DT_START_THIRD = CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_SECOND), 112)	-- 2주차 종료일의 하루 더하기
	SET @V_DT_END_THIRD = CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_THIRD), 112)		-- 3주차 시작일의 6일 더하기
	
	-- 2월도 셋팅해줘야함..
	-- 4주차 시작일 종료일
	SET @V_DT_START_FOURTH = CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_THIRD), 112)	-- 3주차 종료일의 하루 더하기
	SET @V_DT_END_FOURTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FOURTH), 112),5,2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
								ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FOURTH), 112)	
							END		-- 4주차 시작일의 6일 더하기
	
	-- 5주차 시작일 종료일
	-- 5주차 시작일 종료일이 다음달로 넘어가면 해당월 마지막일자로 셋팅
	SELECT @V_DT_START_FIFTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FOURTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
									ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FOURTH), 112)
								END	-- 4주차 종료일의 하루 더하기
	SELECT @V_DT_END_FIFTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FIFTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
									ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_FIFTH), 112)
								END	-- 5주차 시작일의 6일 더하기
	-- 5주차 시작일이 4주차 종료일과 같으면 빈값으로 셋팅..(어짜피 5주차는 없으니까)
	SELECT @V_DT_START_FIFTH = CASE WHEN @V_DT_END_FOURTH = @V_DT_START_FIFTH THEN '' ELSE @V_DT_START_FIFTH END
	SELECT @V_DT_END_FIFTH = CASE WHEN @V_DT_END_FOURTH = @V_DT_END_FIFTH THEN '' ELSE @V_DT_END_FIFTH END

	-- 6주차.. 진짜 간혹가다가 한번 있음(예를 들면 2020년8월)	
	SELECT @V_DT_START_SIXTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FIFTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
									ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 1, @V_DT_END_FIFTH), 112)
								END	-- 5주차 종료일의 하루 더하기
	SELECT @V_DT_END_SIXTH = CASE WHEN SUBSTRING(@V_DT,5,2) <> SUBSTRING(CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_SIXTH), 112), 5, 2) THEN CONVERT(NVARCHAR(8), (DATEADD(MONTH, 1, @V_DT) - DAY(@V_DT)), 112)
									ELSE CONVERT(NVARCHAR(8), DATEADD(DAY, 6, @V_DT_START_SIXTH), 112)
								END	-- 6주차 시작일의 6일 더하기
	-- 6주차 시작일이 5주차 종료일과 같으면 빈값으로 셋팅..(어짜피 6주차는 없으니까)
	SELECT @V_DT_START_SIXTH = CASE WHEN @V_DT_END_FIFTH = @V_DT_START_SIXTH THEN '' ELSE @V_DT_START_SIXTH END
	SELECT @V_DT_END_SIXTH = CASE WHEN @V_DT_END_FIFTH = @V_DT_END_SIXTH THEN '' ELSE @V_DT_END_SIXTH END

	-- 결과
	SELECT @V_DT_START_FIRST	AS START_FIRST,	
		   @V_DT_END_FIRST		AS END_FIRST,
		   @V_DT_START_SECOND	AS START_SECOND,
		   @V_DT_END_SECOND		AS END_SECOND,
		   @V_DT_START_THIRD	AS START_THIRD,
		   @V_DT_END_THIRD		AS END_THIRD,
		   @V_DT_START_FOURTH	AS START_FOURTH,
		   @V_DT_END_FOURTH		AS END_FOURTH,
		   @V_DT_START_FIFTH	AS START_FIFTH,
		   @V_DT_END_FIFTH		AS END_FIFTH,
		   @V_DT_START_SIXTH	AS START_SIXTH,
		   @V_DT_END_SIXTH		AS END_SIXTH

 

2020년 12월 결과를 뽑아보면 아래와 같이 나온다.

 

<끝>

반응형

+ Recent posts