SQL Server 2012 - 检索日期介于两个日期之间的值

Naz*_*Naz 1 sql sql-server sql-server-2012

我有下表称'费率':

Valid From     Employee      Rate
----------------------------------
01/03/2010     1M            50
01/03/2010     2M            75
01/10/2015     1M            55
01/10/2015     2M            80
Run Code Online (Sandbox Code Playgroud)

我还有一个名为'Jobs'的下表:

ID        Employee         OpenedDate     Rate
100000    1M               05/06/2012
100000    2M               08/09/2018
Run Code Online (Sandbox Code Playgroud)

如何从Rates表中检索到Jobs表中的比率,其中OpenedDate大于或等于当前的ValidFrom日期且小于或等于下一个ValidFrom日期,其中Employee也匹配?

所以我最终会:

ID        Employee         OpenedDate     Rate
100000    1M               05/06/2012     50
100000    2M               08/09/2018     80
Run Code Online (Sandbox Code Playgroud)

希望我解释说好的干杯可以提供任何帮助!

ps不知道如何在Stack中显示上面的数据作为表格布局,一直在寻找帮助,但我不知道如何?

Maz*_*har 5

如果您无法修改表以添加"ValidTo"列,则必须使用LEADWindow函数动态创建一个

CREATE TABLE Table1
    ([Valid From] DATETIME, Employee varchar(2), Rate int)
;

INSERT INTO Table1
    ([Valid From], Employee, Rate)
VALUES
    ('2010-01-03 00:00:00', '1M', 50),
    ('2010-01-03 00:00:00', '2M', 75),
    ('2015-01-10 00:00:00', '1M', 55),
    ('2015-01-10 00:00:00', '2M', 80)
;

CREATE TABLE Table2
    (ID int, Employee varchar(2), OpenedDate DATETIME, Rate int)
;

INSERT INTO Table2
    (ID, Employee, OpenedDate, Rate)
VALUES
    (100000, '1M', '2012-05-06 00:00:00', NULL),
    (100000, '2M', '2018-08-09 00:00:00', NULL)
;

;WITH cteValidToAdded
AS(
    SELECT
         T1.[Valid From]
        ,[ValidTo] = ISNULL(LEAD(T1.[Valid From])OVER(PARTITION BY T1.Employee ORDER BY T1.[Valid From], T1.Employee),'25001212') --Some date in distance future
        ,T1.Employee
        ,T1.Rate 
    FROM dbo.Table1 T1
)
SELECT 
     T2.ID
    ,T2.Employee
    ,OpenedDate = CONVERT(VARCHAR(12), T2.OpenedDate, 101)
    ,V.Rate
FROM dbo.Table2 T2
LEFT JOIN cteValidToAdded V ON V.Employee = T2.Employee 
                            AND T2.OpenedDate >= V.[Valid From] AND T2.OpenedDate < V.ValidTo
Run Code Online (Sandbox Code Playgroud)

产量

ID      Employee    OpenedDate  Rate
100000  1M          05/06/2012  50
100000  2M          08/09/2018  80
Run Code Online (Sandbox Code Playgroud)