2012-02-15 2 views
1

사용자가 한 달을 클릭하면이 저장 프로 시저가 실행됩니다. 예약 된 총 시간과 필터링 된 그룹을 확인합니다.여러 날짜 범위를 기준으로 필터링 하시겠습니까?

SELECT 
    tsks.grouping_ref, ttg.description AS grouping_desc, 
    SUM(ts.booked_time) AS booked_time_total, 
    DATENAME(MONTH, ts.start_dtm) + ' ' + DATENAME(YEAR, ts.start_dtm) AS month_name, 
    @month_ref AS month_ref 
FROM 
    timesheets ts 
JOIN 
    timesheet_categories cat ON ts.timesheet_cat_ref = cat.timesheet_cat_ref 
JOIN 
    timesheet_tasks tsks ON ts.task_ref = tsks.task_ref 
JOIN 
    timesheet_task_groupings ttg ON tsks.grouping_ref = ttg.grouping_ref 
WHERE 
    ts.status IN(1, 2) --Booked and approved 
    AND cat.is_leave_category = 0 --Ignore leave 
    AND DATEPART(YEAR, ts.start_dtm) = @Year 
    AND DATEPART(MONTH, ts.start_dtm) = @Month 
GROUP BY 
    tsks.grouping_ref, ttg.description, 
    DATENAME(MONTH, ts.start_dtm), 
    DATENAME(YEAR, ts.start_dtm) 
ORDER BY 
    grouping_desc 

내가 여러 날짜 범위에 따라 필터링 할 :

| Job Group | Month Booked | Time (hrs) | 
    Cleaning  Jan   7 

나는 다음과 같은 SQL이있다.

AND ((ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01') 
OR (ts.start_dtm BETWEEN '2012-01-02' AND '2012-01-29')) 

를하지만 그때는 사용자가 여전히이 OR 문을 수행하므로 모든 레코드를 보여줄 것입니다 클릭 몇 월 중요하지 것이다 실현 :

나는이를 추가하는 방법에 대해 생각했다. 내가 필요로 무엇

는 month_ref 기반으로 뭔가 예입니다 :

CASE WHEN @month_ref = 81201 THEN 
AND (ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01') 
END 

그러나 case 문은 WHERE 절 이후에 갈 필요가있다.

2012 년 회계 연도가 약 12 ​​개월이므로 사용자가 3 월을 클릭하면 올바른 필터가 실행되도록 사례 명세서로 추가해야합니다. 데이터베이스 ts.start_dtm에서

은 다음과 같습니다 : 내 첫 번째 게시물에 대한 충분한 정보했다

2011-04-01 00:00:00.000 

희망?

나는 진술서를 쓰고 있는데, 여기에 몇 시간 동안 노력하고있다.

당신이 도움이 될 수 있습니다 희망 :

답변

0

이 날짜 부분을 사용하여 배제 할 날짜의 불규칙적 인 성격을 부여; 나는 사용자 쿼리를 기반으로 허용되는 날짜의 임시 테이블을 만들고 그것에 가입 할 것입니다. 내 응용 프로그램의 정적 정수 테이블은 1에서 64000까지의 테이블이 다를 수 있습니다.

DECLARE 
    @startdate DateTime = '2012-05-01', 
    @EndDate DateTime = '2012-06-03' 

DECLARE 
    @AllDates TABLE (MyDate DateTime) 

INSERT INTO @AllDates 
SELECT 
    DATEADD(dd, StaticInteger, @startdate) 
FROM dbo.tblStaticIntegers 
WHERE StaticInteger <= DATEDIFF(dd, @startdate, @EndDate) 
+0

감사를 두 날짜를 검색 할 다른 방법이 참조 테이블에 가입하거나 수 ? –

+0

이 예에서는 임시 테이블을 사용하여 쿼리가 yes에 대해 실행될 날짜를 저장합니다. 삽입 문이 작동하도록 영구 테이블을 만들 필요가 있습니다. (아직 가지고 있지 않다는 가정하에) – u07ch

+0

내 저장 프로 시저가 관리 스튜디오에서 작동하는 것으로 보이지만 웹 사이트가 DATE BETWEEN을 좋아하는 것 같습니다. 어떤 아이디어? –

0

하나의 옵션은 시작 날짜와 종료 날짜, 따라서 그 값을 검색하고 ts.start_dtm 검사에서 그들을 사용하는 달의 참조 번호를 매핑 테이블이하는 것입니다. ie 그것은 가지고있을 것입니다 :

Month-ref | 시작 | 끝
81201 | 2011 년 12 월 28 일 | 2012-01-01
81202 | 2012-01-02 | 2012-01-29

당신의 코드 내 DB에 임시 테이블을 생성, 그래서 당신은 그냥 메인 쿼리하기 전에이에 대한

관련 문제