如何使用MS SQL查询查找与日期范围匹配的相关记录

时间:2009-09-09 12:45:09

标签: sql sql-server

我有一张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查询

提前感谢 - 托马斯

4 个答案:

答案 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)