Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL日期排除_Sql_Sql Server - Fatal编程技术网

SQL日期排除

SQL日期排除,sql,sql-server,Sql,Sql Server,我有一组SQL选择,用于收集数据以进行导出和分析。我已经在几个变量中声明了要收集数据的日期范围,并运行了查询,总共有10个选择使用相同的日期范围变量。我想做的是使用某种类型的排除列表轻松地从查询中排除某些日期(它们是一天而不是一个范围),我可以在变量中声明这些排除列表,这样我的所有选择都会删除这些特定日期,而不是编辑每个select语句 DECLARE @date_start DATETIME, @date_end DATETIME SET @date_start = '2011-10-20 0

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

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)
用于:

将此附加到查询中:日期不在(日期1、日期2…)

用于:


将其附加到查询中:和日期不在(date1,date2…)

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

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

创建一个包含您要查找的日期的表变量,并在查询中使用它

您可以使用日期范围变量和另一个保存不需要查找的日期的表来构建该表

大概是这样的:

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)

创建一个包含您要查找的日期的表变量,并在查询中使用它

您可以使用日期范围变量和另一个保存不需要查找的日期的表来构建该表

大概是这样的:

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)

为什么要将日期转换为日期?在SQL Server中处理日期范围时,使用
=
通常会更好。这是一件遗留/惰性的事情,我使用的一些日期列上的数据类型实际上不是数据库中的datetime,这是一种变通方法。为什么要将日期转换为日期?在SQL Server中处理日期范围时,使用
=
通常会更好,这是一种遗留/惰性的方法,我使用的一些日期列上的数据类型实际上不是数据库中的日期时间,这是一种变通方法。