Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MS SQL查询查找与日期范围匹配的相关记录_Sql_Sql Server - Fatal编程技术网

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

如何使用MS SQL查询查找与日期范围匹配的相关记录,sql,sql-server,Sql,Sql Server,我有一张价格计划表 价格计划表 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和唯一的MerchantID。范

我有一张价格计划表

价格计划表

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和唯一的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查询吗

提前谢谢-托马斯

SELECT
    *
FROM
    PricePlan
WHERE
    ValidFrom <= @ToDate
AND
    ValidTo >= @FromDate
编辑:这将找到属于给定范围的所有范围。如果您希望在两个计划涵盖您指定日期的情况下优先考虑其中一个,那么您需要制定该规则


编辑:这将找到属于给定范围的所有范围。如果您希望在两个计划涵盖您指定日期的情况下,将其中一个优先于另一个,那么您需要制定该规则。

您似乎希望选择边界日期最有限的计划-换句话说,@toDate和ValidFrom之间的差异最小化,和@FromDate和ValidTo也被最小化


如果这是对你目标的正确重申,你可以在Robin Day的回答中添加代码,按照差异排序你的结果集,不过,老实说,我不确定SQL是否支持日期算术,并使用limit 1选择第一个结果。

似乎您想要选择边界日期最受限制的计划-换句话说,@toDate和ValidFrom之间的差异最小化,@FromDate和ValidTo之间的差异也最小化


如果这是对您的目标的正确重申,您可以在Robin Day的答案中添加代码,按照差异对结果集进行排序。不过,老实说,我不确定SQL是否支持日期算术,并使用限制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

如果我理解正确的话,对于每个商品,您都在寻找包含所需日期的计划,但该计划是最近生效的。要完成此操作,请尝试以下查询:

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
试试这个:

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
试试这个:

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

不,亲爱的,我需要重新强调我的问题..我希望这些日期不会存储为文本…等等,如果3是,为什么不返回ID 1?不,亲爱的,我需要重新强调我的问题..我希望这些日期不会存储为文本…等等,如果3是,为什么不返回ID 1?谢谢robins,我试过了。为了清楚起见,我重新措辞了这个问题。谢谢罗宾斯,我试过了。为了清楚起见,我重新措辞了这个问题。