Sql 在记录和临时表之间进行选择

Sql 在记录和临时表之间进行选择,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我想显示带有日期序列的2月份记录的电费 如果当月未提供关税,则显示以前的关税 请参阅快照以了解更多说明 作为 设置日期优先1 开始 声明@Day int 声明@fromDt日期 声明@endDate日期 声明@finalendate日期 声明@currentdate=GETDATE 将@fromDt=CASTCONVERTvarchar,DATEPARTYEAR,@Dateset+'-'+CONVERTvarchar,DATEPARTMONTH,@Dateset+'-01'设置为日期 SET @

我想显示带有日期序列的2月份记录的电费 如果当月未提供关税,则显示以前的关税 请参阅快照以了解更多说明

作为 设置日期优先1 开始 声明@Day int 声明@fromDt日期 声明@endDate日期 声明@finalendate日期 声明@currentdate=GETDATE 将@fromDt=CASTCONVERTvarchar,DATEPARTYEAR,@Dateset+'-'+CONVERTvarchar,DATEPARTMONTH,@Dateset+'-01'设置为日期

SET @endDate = DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @fromDt) + 1, 0))
IF @endDate >= @currentdate
BEGIN
  SET @finalEndDate = DATEADD(D, -DATEDIFF(D, @currentdate, @endDate) - 1, @endDate);
  SET @Day = FORMAT(@finalEndDate, 'dd')
END
ELSE
  SET @finalEndDate = @endDate
SET @Day = FORMAT(@finalEndDate, 'dd')
SET NOCOUNT ON;

PRINT @fromDt;
PRINT @finalEndDate;
IF 1 = 0
BEGIN
  SET FMTONLY OFF
END
IF 1 = 0
BEGIN
  SET FMTONLY OFF
END
CREATE TABLE #TestTable2 (
  tempdate date
);

BEGIN
  DECLARE @VarDate datetime = CONVERT(date, @FromDt)
  WHILE @VarDate <= CONVERT(varchar, @finalEndDate)
  BEGIN

    INSERT INTO #TestTable2 (tempdate)
      VALUES (@VarDate)
    SET @VarDate = DATEADD(DAY, 1, @VarDate)
  END
  BEGIN
    WITH tarifReactivelow
    AS (SELECT
      b.tariffrate AS TRL,
      b.EFFECTIVEFROMDATE AS TRLeffectivefrmdate,
      b.effectivetodate AS TRLeffectivetodate,
      a.tempdate
    FROM (SELECT
      *
    FROM #TestTable2) a
    RIGHT JOIN T_EMS_REVENUE_TARIFFDETAILS b
      ON b.TARIFFTYPE = 10
      AND b.REACTIVECHARGETYPE = 2
      AND (
      (a.tempdate BETWEEN CONVERT(date, EFFECTIVEFROMDATE) AND CONVERT(date, EFFECTIVETODATE))
      OR (a.tempdate BETWEEN CONVERT(date, EFFECTIVEFROMDATE) AND CONVERT(date, EFFECTIVETODATE)
      OR CONVERT(date, EFFECTIVEFROMDATE) <= a.tempdate)

      ))
    SELECT
      *
    FROM tarifReactivelow
  END
  DROP TABLE #TestTable2
END

END

您可以使用top 1和

大概是这样的:

select *
from #testtable2 as tt
  outer apply (
    select top 1 td.*
    from t_ems_revenue_tariffdetails as td
    where td.tarifftype=10
      and td.reactivechargetype=2
      and td.effectivefromdate<=tt.tempdate
    order by td.effectivefromdate desc
  ) x
  
请不要
select *
from #testtable2 as tt
  outer apply (
    select top 1 td.*
    from t_ems_revenue_tariffdetails as td
    where td.tarifftype=10
      and td.reactivechargetype=2
      and td.effectivefromdate<=tt.tempdate
    order by td.effectivefromdate desc
  ) x