首页 > 解决方案 > 在 SQL 中正确显示下一个计费周期开始日期 - [应根据报表运行日期显示未来计费日期]

问题描述

我有一个 SSRS 报告,其中我将“下一个计费周期”开始日期显示为一列。此报告针对报告生成日期运行,并显示下一个计费周期日期。

例如,

如果我的计费开始日期是“2018 年 3 月 2 日”并且我的计费周期频率是“3 个月”。如果我在“2018 年 3 月 5 日”运行报告,那么我想将“2018 年 3 月 3 日”显示为下一个计费开始日期。如果我在“2018 年 6 月 5 日”运行报告,那么我想将“2018 年 9 月 3 日”显示为下一个计费开始日期,依此类推。

目前正在使用以下逻辑。,

DECLARE @ReportRundDate    DATETIME = '2019-09-01', 
        @Billingdate     DATETIME = '2019-07-01', 
        @BillingCycle INT = 3 

       SELECT CONVERT(VARCHAR(25), Dateadd(month, (Ceiling((Cast(Datediff(month, @Billingdate, @ReportRundDate)AS DECIMAL(18, 3))/@BillingCycle) ) + 
       (
       CASE WHEN Datepart (day, @ReportRundDate) > Datepart(day, @Billingdate) THEN 1 ELSE 0 END)) * @BillingCycle, @Billingdate), 103) 
       + ' - ' 
       + CONVERT(VARCHAR(25), Dateadd(month, @BillingCycle, Dateadd(month, ( Ceiling (Datediff(month, @billingdate, @ReportRundDate)*1.0 / @BillingCycle) + 
       ( 
       CASE WHEN Datepart(day, @ReportRundDate) > Datepart(day, @billingdate) THEN 1 ELSE 0 END )) * @BillingCycle, @billingdate))-1, 103) 

但在某些情况下,它会产生意想不到的结果,例如当您选择像 1、2、3 这样的月份开始日期时,它并没有得出正确的结果,但不是每个月都有。我仍然无法跟踪确切的意外结果参数。我会尽快发布它们。有人可以查看这段代码,如果我做错了什么,请告诉我。在我最初的分析中,似乎当我避免使用 'CEILING(' 时,它在某些情况下会显示正确的结果,而当我使用 'CEILING(' 时,结果会相反。

标签: sqlsql-server

解决方案


从表面上看,您只想将 90 天而不是 3 个月添加到计费开始日期:

DECLARE @ReportRundDate     DATETIME = '20180305', 
        @BillingStartDate   DATETIME = '20180302', 
        @BillingCycle       INT = 3

        SELECT @BillingStartDate, DATEADD(DAY, 30 * @BillingCycle, @ReportRundDate) [NextBillingStartDate];

        SELECT  @ReportRundDate     = '20180605',
                @BillingStartDate   = '20180603';

        SELECT @BillingStartDate, DATEADD(DAY, 30 * @BillingCycle, @ReportRundDate) [NextBillingStartDate];

此外,如果您避免在日期中使用破折号“-”,它们将变得与语言环境无关。因此,“2018-02-01”可以是 2 月 1 日或 1 月 2 日,具体取决于服务器的区域设置,但 20180201始终是2018 年 2 月 1 日。


推荐阅读