Sql 根据服务日期加入正确的预算日期范围字段

Sql 根据服务日期加入正确的预算日期范围字段,sql,sql-server-2008,date,Sql,Sql Server 2008,Date,我有两张桌子需要合并。第一个表包含提供服务的日期和该服务的成本。第二个表包括给定时间段内服务的最大预算。以下服务有两个预算,一个从“2012年4月2日”开始,到“2013年4月2日”结束,但在“2014年4月2日”结束的同一天更新。该服务于2013年4月15日实施 因此,我需要附上与服务时间相关的预算:“2013年4月2日”至“2014年4月2日”。由于一个预算在四月份结束,并在四月份在下面的计划中更新,因此两个预算都合并在一起 我需要加入开始日期和结束日期,其中开始日期介于这两个日期之间。 C

我有两张桌子需要合并。第一个表包含提供服务的日期和该服务的成本。第二个表包括给定时间段内服务的最大预算。以下服务有两个预算,一个从“2012年4月2日”开始,到“2013年4月2日”结束,但在“2014年4月2日”结束的同一天更新。该服务于2013年4月15日实施 因此,我需要附上与服务时间相关的预算:“2013年4月2日”至“2014年4月2日”。由于一个预算在四月份结束,并在四月份在下面的计划中更新,因此两个预算都合并在一起

我需要加入开始日期和结束日期,其中开始日期介于这两个日期之间。

CREATE TABLE #Service_Budget(
        ID int,
        SERV_Type int,
        Start_DT  datetime,
        End_DT  datetime,
        Budget int, 
        NUMBER_OF_MONTHS_OF_SERVICES int
    );
INSERT INTO #Service_Budget VALUES 
(13946, 5,  '4/2/2012', '4/2/2013', 622.4, 12), 
(13946, 5,  '4/2/2013', '4/2/2014', 788.4, 12) 

CREATE TABLE #Service_Visits(
ID  int,
Service_Type int,   
DOSStart datetime,
BillableUnits int,
RATE_AMOUNT int
 );

INSERT INTO #Service_Visits VALUES
(13946, 5,  '4/15/2013', 3,75.5)


SELECT    
a.ID,
a.Service_Type,
a.DOSStart,
MONTH(a.DOSStart) AS Month,
YEAR(a.DOSStart) AS Year,
MONTH(b.START_DT) AS Start_Month,
YEAR(b.START_DT) AS Start_Year,
b.Start_DT,
b.End_DT,
 a.RATE_AMOUNT,
 (a.RATE_AMOUNT * a.BillableUnits) as Total,  
 b.Budget,
 b.NUMBER_OF_MONTHS_OF_SERVICES
 FROM #Service_Visits as a join #Service_Budget as  b
   on a.ID=b.ID
这就是我得到的:

ID  Service_Type    DOSStart    Month   Year    Start_Month Start_Year  Start_DT    End_DT  RATE_AMOUNT Total   Budget  NUMBER_OF_MONTHS_OF_SERVICES
13946   5   2013-04-15 00:00:00.000 4   2013    4   2012    2012-04-02 00:00:00.000 2013-04-02 00:00:00.000 75  225 622 12
13946   5   2013-04-15 00:00:00.000 4   2013    4   2013    2013-04-02 00:00:00.000 2014-04-02 00:00:00.000 75  225 788 12

请注意,两个预算都已合并,请注意与开始日期相关的预算。

您可以使用a.ID=b.ID上的
BETWEEN
子句
,以及开始日期和结束日期之间的DOSSTART
。试试这个:

CREATE TABLE #Service_Budget(
        ID int,
        SERV_Type int,
        Start_DT  datetime,
        End_DT  datetime,
        Budget int, 
        NUMBER_OF_MONTHS_OF_SERVICES int
    );
INSERT INTO #Service_Budget VALUES 
(13946, 5,  '4/2/2012', '4/2/2013', 622.4, 12), 
(13946, 5,  '4/2/2013', '4/2/2014', 788.4, 12) 

CREATE TABLE #Service_Visits(
ID  int,
Service_Type int,   
DOSStart datetime,
BillableUnits int,
RATE_AMOUNT int
 );

INSERT INTO #Service_Visits VALUES
(13946, 5,  '4/15/2013', 3,75.5)


SELECT    
a.ID,
a.Service_Type,
a.DOSStart,
MONTH(a.DOSStart) AS Month,
YEAR(a.DOSStart) AS Year,
MONTH(b.START_DT) AS Start_Month,
YEAR(b.START_DT) AS Start_Year,
b.Start_DT,
b.End_DT,
 a.RATE_AMOUNT,
 (a.RATE_AMOUNT * a.BillableUnits) as Total,  
 b.Budget,
 b.NUMBER_OF_MONTHS_OF_SERVICES
 FROM #Service_Visits as a join #Service_Budget as  b
   on a.ID=b.ID AND DOSStart BETWEEN Start_DT AND End_DT