0

我以这些日期为例:

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

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

4

2 回答 2

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
  );

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

于 2013-04-15T18:38:39.463 回答
1

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

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

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

在重新阅读问题时,您明确说明“如果它的 date1 在这两个日期之间”。如果是这样,请尝试:

if not exists (
    select *
    from OfferProducts op
    where op.codP = @codP and
          op.date1 between @date1 and @date2
  )
  . . .
于 2013-04-15T18:39:37.447 回答