我以这些日期为例:
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
返回多个不起作用的值。任何帮助表示赞赏。
答案 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
)
. . .