我有一个价目表,不同的客户会根据他们注册我的服务获得不同的价格。
每个客户都有一个创建日期,价格具有有效的起始日期,除非它是当前价格,因此该日期为空。
如何获取给定客户创建日期的给定商品的价格。
这是我的价目表。
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子句来覆盖它,但是我的大脑无法想出来目前只有一个。
答案 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
。如果其中有重复项,则ValidTo
为NULL
的任意行。如果没有NULL
,则为最新的ValidTo
。