2013-12-12 1 views
0

벽에 머리를 대고 나무가 보이지 않아 나무가 보이지 않습니다 ...사용자 정의 캘린더를 사용하는 사이에 여러 행의 날짜가 표시됩니다.

두 개의 테이블이 있습니다. 1. ID 필드, 시작 날짜 및 종료 날짜 열. 2. 날짜 및 근무일 열.

두 번째 달력에서이 날짜를 사용하여 각 행에 대해 두 날짜 사이의 날짜를 계산하면됩니다. Googl'ing은 시작일과 종료일을 기준으로 날짜 표가없는 많은 예제와 많은 예제를 발견했습니다.

된 table_1이 - 모든 ID

id   start_date  end_date 
123   01/01/2013  03/01/2013 
456   02/01/2013  08/01/2013 
789   06/01/2013  07/01/2013 

Table_2에 대한 항목을 포함합니다 - 일상에 대한 항목을 포함

e_day   workday 
01/01/2013   1 
02/01/2013   0 
03/01/2013   1 
04/01/2013   1 
05/01/2013   0 
06/01/2013   1 
07/01/2013   0 
08/01/2013   0 

결과 ID 시작일의 종료일의 days_between 123 2013년 1월 1일 03/01/2013 2 456 02/01/2013 08/01/2013 3 789 06/01/2013 07/01/2013 1

1 id의 값을 찾을 수 있습니다.

SELECT COUNT(workday) FROM table_2 
WHERE workday = 1 AND cal_day >= '01/01/2013' 
AND cal_day <= '03/01/2013'; 

이 논리를 table_1에 넣는 방법을 모르겠습니다. bodged 예를 들어 테이블을 생성 (분명히 정확하지)

SELECT 
table_1.id, 
table_1.start_date, 
table_1.end_date, 
(COUNT(table_2.workday) FROM table_2 WHERE table_2.workday = 1 
AND table_2.e_day >= table_1.start_date 
AND table_2.e_day <= table_2.end_date) AS days_between 
FROM table_1 

코드 IE;

CREATE TABLE #table_1(id INT, start_date SMALLDATETIME, end_date SMALLDATETIME); 
CREATE TABLE #table_2(e_day SMALLDATETIME, workday BIT); 

INSERT #table_1 VALUES (123,'01/01/2013','03/01/2013') 
INSERT #table_1 VALUES (456,'02/01/2013','08/01/2013') 
INSERT #table_1 VALUES (789,'06/01/2013','07/01/2013') 

INSERT #table_2 VALUES ('01/01/2013',1) 
INSERT #table_2 VALUES ('02/01/2013',0) 
INSERT #table_2 VALUES ('03/01/2013',1) 
INSERT #table_2 VALUES ('04/01/2013',1) 
INSERT #table_2 VALUES ('05/01/2013',0) 
INSERT #table_2 VALUES ('06/01/2013',1) 
INSERT #table_2 VALUES ('07/01/2013',0) 
INSERT #table_2 VALUES ('08/01/2013',0) 

SELECT * FROM #table_1 
SELECT * FROM #table_2 

테이블을 제거하는 코드.

DROP TABLE # table_1 DROP TABLE # table_2;

감사합니다 당신이 사전 :

답변

0

에 도움이 모든이를보십시오 :

select a.id,a.start_date,a.end_date,sum(cast(workday as tinyint)) as NumWorkDays, 
      count(*) as Total_days 
from idTable a 
join workdaytable b on b.eday between a.start_date and a.end_Date 
group by a.id,a.start_date,a.end_date 

select a.id,a.start_date,a.end_date 
where id=123 

id start_date end_date 
123 1/1/2013  3/1/2013 

반환합니다 ID = 123

에 대한 하나 개의 행을 무슨 일이 일어나고 있는지 시각화 이제 조인 할 때 e_day와 workday 플래그 열을 추가하고 각 e에 대해 하나의 행을 추가합니다 두 번째 테이블에서 _day는

id start_date end_date e_day work_day 
123 1/1/2013  3/1/2013 1/1/2013  0 
123 1/1/2013  3/1/2013 1/2/2013  1 
123 1/1/2013  3/1/2013 1/3/2013  1 
etc. 

이제 우리는 5 열 및 2013년 1월 1일 및 2013 년 3 월 사이에 내리는 두 번째 테이블에서 매일 하나의 행에 큰 "테이블"을했다. 합계 연산은 조인으로 작성한 "테이블"의 모든 work_day 플래그를 단순히 추가합니다. 당신이 가입 (및 합계를 제거하고 계산)없이 쿼리를 실행하면, 당신은 당신이 필요합니다으로 작성되는 "테이블"...이 조금 도움이

희망 ...

+0

를 볼 수 있습니다 작동하기 전에 workday를 int로 변환하십시오. – JMK

+0

나는 이것을 완전히 이해하지 못한다고 고백해야하지만 정확히 묻는다. 고맙습니다! –

+0

감사합니다. 스파키.스폿 답변과 나는 심지어 지금 그것을 이해한다! 도움을 많이 주셔서 감사합니다. –

관련 문제