2014-07-01 2 views
0

파일의 데이터 레코드가 다른 경우 시작 날짜와 종료 날짜가 있습니다. 날짜는 5 년 이상 걸립니다. 지금은 시작 날짜에서 종료 날짜까지 1 년 간격을 사용하여 날짜를 분할하려고합니다.SQL을 사용하여 날짜 분할

SQL을 사용하여 레코드가 포함 된 파일을 반복하고 다른 테이블에 자동으로 삽입하려면 어떻게해야합니까?

미리 감사드립니다.

+0

테이블을 통해 루프를 실행하고 있습니까 (데이터가 이미 테이블에 있습니까?) 또는 SQL로 파일을 실제로 읽어야합니까? – Cheruvian

+3

일반적으로이 작업을 수행하지 않을 것이며 SQL *을 사용하여 수행 할 수도 있습니다. 당신은 정말로 *하려고합니까? 날짜를 다른 테이블로 나누는 것은 문제가되지 않습니다. 그것은 문제에 대한 의문스러운 해결책 *입니다. * 진짜 * 문제는 무엇입니까? –

+0

데이터가 시작일과 종료일이있는 Excel 파일에 있습니다. 이 데이터를 SQL 테이블로 추출 할 수 있습니다. 지금은 날짜를 분할하고 사용할 수있는 새로운 SQL 테이블로 결과를 이동 찾고 있습니다. – user3782929

답변

0

루프를 사용하지 않겠습니다.

이렇게해야합니다.

SELECT t.info, YEAR(t.Date) 
FROM yourtable AS t 
WHERE t.Date BETWEEN @StartDate AND @EndDate 
+0

t.info가 그룹에 있지 않거나 집합체가 아니기 때문에 실행되지 않습니다 – Cheruvian

+0

환호성이 잘못되었습니다. – Bobby

0

"annualized"하위 집합을 다른 테이블에 쓰지 않고 가져올 수 있습니다. 그리고 일반적으로 을 다른 테이블에 쓰지 않아야합니다. 원본 테이블의 데이터가 변경되면 다른 테이블에 행을 빠르게 작성하면 유지 관리에 어려움이 생길 수 있습니다. 테이블의 다른 데이터에 따라 행을 다른 테이블에 작성하면 정확한 집계 쿼리 (min(), max(), sum(), avg() 등을 사용하는 쿼리를 실행하는 것이 불가능하지는 않더라도 어렵게 될 수 있습니다.).

테이블을 만들어 보겠습니다.

create table test (
    start_date date, 
    end_date date 
); 

-- Start in 2005; lasts more than a year. 
insert into test values ('2005-03-02', '2014-12-31'); 

-- Start in 2005; lasts less than a year. 
insert into test values ('2005-03-02', '2005-10-18'); 

-- Not in 2005. 
insert into test values ('2006-02-15', '2008-11-13'); 

모든 "2005"행을 가져 오려면이 쿼리를 실행하십시오. 2005-01-01보다 늦은 경우 start_date의 실제 값을 원한다고 가정합니다.

select 
    case when '2005-01-01' between start_date and end_date 
     then '2005-01-01' else start_date 
    end start_date, 
    case when '2005-12-31' between start_date and end_date 
     then '2005-12-31' else end_date 
    end end_date 
from test 
where 2005 between extract(year from start_date) and extract(year from end_date) 
order by start_date, end_date; 
 
start_date end_date 
-- 
2005-03-02 2005-10-18 
2005-03-02 2005-12-31 

비슷한 방법으로 모든 "2006"행을 가져옵니다. 물론

select 
    case when '2006-01-01' between start_date and end_date 
     then '2006-01-01' else start_date 
    end start_date, 
    case when '2006-12-31' between start_date and end_date 
     then '2006-12-31' else end_date 
    end end_date 
from test 
where 2006 between extract(year from start_date) and extract(year from end_date) 
order by start_date, end_date; 
 
start_date end_date 
-- 
2006-01-01 2006-12-31 
2006-02-15 2006-12-31 

, 당신은 create view 절에이 문장의 각을 포장 할 수 있습니다. 일 것이므로 일 것입니다.

+0

고마워요. 나는 이것을 시도 할 것이다. – user3782929

관련 문제