2012-05-24 3 views
2

나는 내보내기 및 분석을 위해 데이터를 수집하는 SQL을 선택했습니다. 몇 가지 변수에 대해 데이터를 수집하고 쿼리를 실행하려는 날짜 범위를 선언했습니다. 동일한 날짜 범위 변수를 사용하는 총 10 개의 선택 항목이 있습니다. 내가 무엇을하고 싶은지를 쉽게 제외 할 수 있습니다 특정 날짜 (그들은 범위보다는 단일 일) 쿼리에서 제외 목록의 일종을 내가 변수에 선언 할 수 있도록 모든 선택 내 모든 선택을 편집하지 않고 그 특정 날짜를 제거합니다 성명서.SQL 날짜 제외

DECLARE @date_start DATETIME, @date_end DATETIME 
SET @date_start = '2011-10-20 00:00:00' 
SET @date_end = '2012-05-18 23:59:59' 

SELECT 
date, col1, col2, col3 
FROM 
table1 
WHERE 
date BETWEEN CONVERT(DATETIME, @date_start, 102) AND CONVERT(DATETIME, @date_end, 102) 

SELECT 
date, col4, col5, col8 
FROM 
table2 
WHERE 
date BETWEEN CONVERT(DATETIME, @date_start, 102) AND CONVERT(DATETIME, @date_end, 102) 

SELECT 
date, col3, col5, col6, col7, col8 
FROM 
table3 
WHERE 
date BETWEEN CONVERT(DATETIME, @date_start, 102) AND CONVERT(DATETIME, @date_end, 102) 
+2

왜 날짜를 날짜로 '변환'합니까? – Oded

+1

일반적으로 SQL Server에서 날짜 범위를 사용하는 경우'between '대신'> ='및'< '를 사용하는 것이 좋습니다. 이렇게하면보다 합리적인 표현을 사용하고 마지막 두 번째 기간 (예 : '2012-05-18T23 : 59 : 59.003')에 누락 된 항목을 놓치지 않도록 할 수 있습니다. –

+0

그것은 레거시/게으른 것입니다. 사용하고 있던 일부 날짜 열의 데이터 형식은 실제로 데이터베이스에서 datetime이 아니 었습니다. 해결 방법이 있습니다. – user1414459

답변

0

사용 : 조회에

추가]이 :하지 (날짜 1, 날짜 2 ...)

0

에서 날짜와 당신이 선택한 날짜를 지정하는 경우 상태에서 사용 할 수 있습니다. 또한 날짜 부분 만 고려할 때는 yyyy/MM/dd 형식을 제공하는 Convert (varchar, datecolumn, 111)를 사용하는 것이 좋습니다. 시간을 낼 필요가 없습니다 23:59:59.

0

찾고있는 날짜로 테이블 변수를 만들고이를 쿼리에 사용하십시오.

날짜 범위 변수와 찾고자하지 않는 날짜를 포함하는 다른 테이블을 사용하여 해당 테이블을 작성할 수 있습니다.

이런 식으로 뭔가 :

declare @date_start datetime 
declare @date_end datetime 

-- The date range you want. Don't add time part. 
set @date_start = '20010102' 
set @date_end = '20010107' 

declare @NotTheDatesYouAreLookingFor as table 
(
    date datetime 
) 

insert into @NotTheDatesYouAreLookingFor values 
('20010103'), 
('20010105') 

declare @TheDatesYouAreLookingFor as table 
(
    date datetime primary key 
) 

;with C(date) as 
(
    select @date_start 
    union all 
    select date + 1 
    from C 
    where date < @date_end 
) 
insert into @TheDatesYouAreLookingFor(date) 
select date 
from C 
    where date not in (select date 
        from @NotTheDatesYouAreLookingFor) 

을 그리고 당신의 쿼리는 테이블이 같은 @TheDatesYouAreLookingFor를 사용해야합니다.

select T1.date, T1.col1, T1.col2, T1.col3 
from table1 as T1 
    inner join @TheDatesYouAreLookingFor as TD 
    on T1.date >= TD.date and T1.date < dateadd(day, 1, TD.date)