2

我有一堆 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)
4

3 回答 3

0

用于:

将此附加到您的查询中:AND date not in (date1,date2...)

于 2012-05-24T09:03:08.670 回答
0

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

于 2012-05-24T09:05:43.080 回答
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)
于 2012-05-24T09:09:36.807 回答