如何在数据从列到列有效的给定日期加载单个价格

时间:2014-03-31 20:38:32

标签: sql sql-server

我有一个价目表,不同的客户会根据他们注册我的服务获得不同的价格。

每个客户都有一个创建日期,价格具有有效的起始日期,除非它是当前价格,因此该日期为空。

如何获取给定客户创建日期的给定商品的价格。

这是我的价目表。

PriceId Rate      ValidFrom     ValidTo
26708   1.0000    2013-07-10    NULL
26709   100.0000  2013-07-10    2014-05-01

我第一次尝试查询时效果不佳。

DECLARE @CreatedDate datetime2 = '2014-01-01'

SELECT * 
FROM [PriceList] 
where ValidFrom < @CreatedDate and (ValidTo > @CreatedDate or ValidTo is null)

这适用于在创建新价格后进口的新客户,但对于老客户,我同时获得两种价格。我知道为什么我得到两个价格,但不能弄清楚如何得不到具有null ValidTo日期的那个。

如果有帮助,我很乐意将ValidTo日期设置为值而不是null。我可以用一个常见的表表达式解决这个问题,但是我需要更改我的应用程序的主要部分才能做到这一点,我真的在寻找一个where子句来覆盖它,但是我的大脑无法想出来目前只有一个。

2 个答案:

答案 0 :(得分:0)

你尝试过吗?

DECLARE @CreatedDate datetime2 = '2014-01-01'

SELECT * 
FROM [PriceList] 
where @CreatedDate BETWEEN ValidFrom AND ValidTo

虽然,你不想离开ValidTo Null。在旧工作中,我们将日期设置为1-1-2999 如果你不得不留空

DECLARE @CreatedDate datetime2 = '2014-01-01'

SELECT * 
FROM [PriceList] 
where @CreatedDate BETWEEN ValidFrom AND ISNULL(ValidTo, '1/1/2999')

答案 1 :(得分:0)

哦,如果价格重叠,你的数据结构会很糟糕。您可以使用top

执行所需操作
select top 1 pl.*
from pricelist pl
where ValidFrom < @CreatedDate and (ValidTo > @CreatedDate or ValidTo is null)
order by ValidFrom desc,
         (case when ValidTo is null then 0 else 1 end),
         ValidTo desc;

根据有效日期对行进行优先排序,并选择一行 - 最近的ValidFrom。如果其中有重复项,则ValidToNULL的任意行。如果没有NULL,则为最新的ValidTo