2015-01-05 1 views
1

데이터를 추출 할 특정 날짜를 결정해야합니다.SQL - 근무일 기준으로 특정 날짜를 얻으십시오

예를 들어, 매월 1 일에 이루어지는 트랜잭션은 2 일 회계 시스템에 게시되고 해당 월의 마지막 날에 이루어지는 트랜잭션은 1 일 회계 시스템에 전기됩니다. 다음 달.

그래서 일반적으로 10 월에 10 월이되는 모든 레코드를 가져올 수 있지만 10 월 2 일과 11 월 2 일 사이에 날짜가있는 레코드를 추출해야합니다.

Declare @EarliestDate varchar(8), @SQL NVARCHAR(1000), @sDate varchar(8) 

-- get data for the last 3 months 
SET @EarliestDate= CAST(DATEPART(YEAR,DATEADD(m,-3, getdate())) AS VARCHAR(4)) 
    + RIGHT('00' + CAST(DATEPART(mm, DATEADD(m,-2, getdate())) AS varchar(2)), 2)+ '02' 
:

나는 (그것은 주말이 경우에서와 같이 만약 레코드가 주말 후 첫 근무일에 대한 포스팅 날짜를 표시합니다 중요하지 않습니다) 가장 빠른 날짜를 얻을 수있는 아래의 코드를

이제 11 월 1 일이 주말인지 확인해야합니다. 그렇다면 다음 월요일의 날짜를 사용하십시오.

나는 아래의 코드를 시작했다하지만 난 제대로 동작하지 않습니다 :

Declare @LatestDate datetime 

set @LatestDate = '01/11/2014' 

if datepart(dw,@LatestDate) in (1,7) 
Begin 
    set @LatestDate = DATEADD(d,1,@LatestDate) 
End 

하십시오 당신은 저를 보여줄 수 내가 잘못 하겠어 어디? 이상적으로는 연중 무휴로 일년 내내 일해야하며, 매월 1 일 이후 항상 첫 근무일을 얻습니다.

+2

, 당신은 방아쇠를 통해 채워지는 새로운 메타 데이터 열을 추가하는 것이 좋습니다, 그럼 그냥 떨어져 조회 그 열. 당신이 알고있는 것보다 더 많은 비즈니스 로직이있는 것처럼 보입니다. 휴일 문제입니까? –

+0

@LynnCrumbling : 예, 방금 휴일이 문제가 될 것임을 상기시켜주었습니다. 날짜가 공휴일 테이블에도 있는지 확인해야합니다. –

+1

나는 언젠가 다른 사람이 언젠가는, Post_Date를 기반으로 쿼리해야 할 것입니다. 이것은 응용 프로그램이나 행 삽입/업데이트에서 실행되는 트리거로 채워야하는 추가 열과 같은 느낌입니다. –

답변

1

Create and Populate at Date Dimension for Data Warehouse에있는 날짜 테이블을 생성하고 다음 근무일을 확인하는 데 사용하는 것이 좋습니다. 제 자신의 목적을 위해서 저는 영국의 모든 칼럼과 회계 칼럼을 삭제했습니다. 자신 만의 휴일도 추가 할 수 있으며 특정 기능을 만드는 대신 쿼리에 직접 참여할 수 있습니다. 날짜가에

를 사용하여 라인

Set Dateformat dmy; 

문자열 변환을 보장하기 위해 :

여기에서 고려해야 할 몇 가지가 있습니다
DECLARE @LatestDate date 

SET @LatestDate = '01/11/2014' 

SELECT @LatestDate = MIN([Date]) FROM DimDate 
WHERE [Date] >= @LatestDate 
AND IsWeekday = 1 AND IsHoliday = 0 

PRINT @LatestDate 
+2

이것은 본질적으로 링크 전용 답변입니다. 귀하가 OP로 솔루션을 사용하도록 요청하는 대부분의 콘텐츠는 다른 웹 사이트에 있습니다. –

+0

다니엘 감사합니다, 나는 모든 미국 공휴일 컬럼과 날짜를 꺼냈다. 그리고 그것은 직업을한다. .. –

1

:

그런 다음 당신은 다음을 수행 할 수 있습니다 올바른 날짜 형식으로 (이 경우 비 미국).

특정 서버의 정확한 주말 날짜를 확인하십시오 (1,7). 다음을 실행하여이를 테스트 할 수 있습니다.

Select @@Datefirst 

어떤 요일이 첫 번째인지 알려줍니다. 기본값은 7입니다 (일요일), 아래 예제에서 작동합니다. 필요한 경우이를 변경할 수 있습니다 :

http://msdn.microsoft.com/en-gb/library/ms181598.aspx

이것은 당신이 포트에 다른 서버에 코드를 계획하는 경우에주의해야 할 무언가이다.

토요일의 일요일 (1)과 (2)를 추가해야합니다 귀하의 코드 :

-- Saturday 
if datepart(dw,@LatestDate) = (1) 
    set @LatestDate = DATEADD(dd,1,@LatestDate); 

-- Sunday 
if datepart(dw,@LatestDate) = (7) 
    set @LatestDate = DATEADD(dd,2,@LatestDate); 

(약간의 초기 오버 헤드가보다 강력한 또한 쉽게,보다 효율적이고 즉, @@ DATEFIRST를 추가하는 동안, 날짜 치수를 사용하여 독립).또한 공휴일을 쉽게 채우고이를 고려할 수 있습니다. 날짜 차원 테이블을 채우는 거기 많은 스크립트는, 예를 들어 있습니다 : 그것은 옵션이 있다면

http://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-Data-Wareho

관련 문제