我有一张PricePlan表,看起来像
表PricePlan
ID MerchantID NAME VALIDFROM VALIDUPTO
1. M1 Plan A 1-sep-09 30-sep-09
2. M1 Plan B 7-sep-09 21-sep-09
3. M2 Plan Da 1-sep-09 30-Sep-09
鉴于@FromDate和@ToDate,我需要找到匹配的ID和Unique MerchantID。实施例
@FromDate = '7-sep-09'
@Todate = '9-sep-09'
The return result should be ID 2- M1-Plan B , ID 3-M2-Plan Da
任何人都可以帮我解决SQL查询
提前感谢 - 托马斯
答案 0 :(得分:3)
SELECT
*
FROM
PricePlan
WHERE
ValidFrom <= @ToDate
AND
ValidTo >= @FromDate
编辑:这将找到您指定范围内的所有范围。如果您希望在两个计划涵盖指定日期的情况下优先考虑其中一个,那么您需要提出该规则。
答案 1 :(得分:1)
如果我理解正确,对于每个MerchantID,您正在寻找包含所请求日期的计划,但该计划是最近生效的计划。要完成此操作,请尝试以下查询:
select ID, MerchantID, NAME
from PricePlan pp
inner join (
select MerchantID, max(VALIDFROM) as VALIDFROM
from PricePlan
where VALIDFROM <= '7-sep-09'
and VALIDUPTO >= '9-sep-09'
group by MerchantID
) pp2 on pp.MerchantID = pp2.MerchantID
and pp.VALIDFROM = pp2.VALIDFROM
答案 2 :(得分:0)
您似乎想要选择边界日期最为有限的计划 - 换句话说,@ toDate和ValidFrom之间的差异被最小化,而@FromDate和ValidTo也被最小化。
如果这是对您的目标的正确重述,您可以添加Robin Day的答案代码来按差异排序结果集(但是,老实说,我不确定SQL是否支持日期算术)并选择使用限制1的第一个结果。
答案 3 :(得分:0)
试试这个:
DECLARE @YourTable table (RowID int, Merchant char(2), NameOf varchar(7), ValidFrom datetime, ValidTo datetime)
INSERT INTO @YourTable VALUES (1,'M1','Plan A' ,'1-sep-09','30-sep-09')
INSERT INTO @YourTable VALUES (2,'M1','Plan B' ,'7-sep-09','21-sep-09')
INSERT INTO @YourTable VALUES (3,'M2','Plan Da','1-sep-09','30-Sep-09')
--SELECT * FROM @YourTable
DECLARE @FromD datetime
DECLARE @ToD datetime
SET @FromD ='7-sep-09'
SET @ToD ='9-sep-09'
SELECT TOP 1
*
FROM @YourTable
WHERE ValidFrom <= @FromD AND ValidTo >= @ToD
ORDER BY datediff(day,ValidFrom,@FromD)+datediff(day,@ToD,ValidTo) ASC, RowID
输出:
RowID Merchant NameOf ValidFrom ValidTo
----------- -------- ------- ----------------------- -----------------------
2 M1 Plan B 2009-09-07 00:00:00.000 2009-09-21 00:00:00.000
(1 row(s) affected)