如何在SQL Server中将数据与多项选择进行比较?

时间:2013-04-15 18:33:53

标签: sql sql-server

我以这些日期为例:

date1: 2013-01-01
date2: 2013-01-25

如果date1介于这两个日期之间,我需要创建一个将产品特价商品插入数据库的程序。

create procedure CreateOfferProduct(
@codP varchar(5),
@date1 date,
@date2 date,
)
as
if(not exists(
        select * from OfferProducts
            where Products.codP = @codP 
            and @date1 <= (select date2 from OfferProducts where codP = @codP)
    )
)
begin
       insert into OfferProducts(codP, date1, date2) 
       values(@codP, @date1, @date2);   
end

但是,因为

select date2 from Products where codP = @codP

返回多个不起作用的值。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

这是插入目标中尚不存在的多个行的一种方法,而不是执行这种逐行技术,您可以在其中为变量赋值(速度较慢且不灵活)。

INSERT dbo.OfferProducts(codP, date1, date2)
  SELECT p.codP, @date, @date2
  FROM dbo.Products AS p
  WHERE codP = @codP
  AND NOT EXISTS 
  (
    SELECT 1 FROM dbo.OfferProducts 
      WHERE codP = p.codP
      AND date2 >= @date1 -- this logic seems funny
  );

如果您显示样本数据和所需结果,包括您希望从插入中排除的现有数据,我们可能能够为您制定更好的逻辑。

答案 1 :(得分:1)

您正在寻找两个时间段的交集。以下可能是您想要的:

. . .
if not exists (
    select *
    from OfferProducts op
    where op.codP = @codP and
          (op.date1 <= @date2 and
           op.date2 >= @date1)
  )
  . . .

重叠的确切定义取决于终点是否包含在日期范围内。

在重新阅读问题时,您明确说明&#34;如果其date1介于这两个日期之间&#34;。如果是,请尝试:

if not exists (
    select *
    from OfferProducts op
    where op.codP = @codP and
          op.date1 between @date1 and @date2
  )
  . . .