SQL日期排除

时间:2012-05-24 08:54:04

标签: sql sql-server

我有一堆SQL选择,用于收集数据以进行导出和分析。我已经在几个变量中声明了我想要收集数据的日期范围并运行查询,有10个选择总数使用相同的日期范围变量。我想要做的是使用我可以在变量中声明的某种排除列表从查询中轻松排除某些日期(它们是单日而不是范围),这样我的所有选择都会删除这些特定日期而不是编辑每个选择日期言。

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)

3 个答案:

答案 0 :(得分:0)

使用IN:

将此附加到您的查询中:AND日期不在(date1,date2 ...)

答案 1 :(得分:0)

您可以在where条件中使用IN来指定所选日期。而且当你只考虑日期部分时,最好使用Convert(varchar,datecolumn,111),它给出了yyyy / MM / dd格式。没必要给时间23:59:59。

答案 2 :(得分: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)