如何使用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,我试过了。为了清楚起见,我重新措辞了这个问题。谢谢罗宾斯,我试过了。为了清楚起见,我重新措辞了这个问题。