sql - 在 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(' 时,结果会相反。
解决方案
从表面上看,您只想将 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 日。
推荐阅读
- c# - 在 C# 中使用非原始类型重新创建 C++ 联合类型时出现对齐错误
- python - 求解一组非线性方程,产生具有最小方差的输出
- regex - 在字符类中包含不间断的空格
- php - MySql While 循环查询时间过长
- c++ - 如何在sqlite3 c ++中绑定日期时间函数
- javascript - 为什么这个`do`-`while`循环在结束后重复最后一个值?
- scala - Spark - 更改数据集中属于长尾的记录的值
- python - 如何使用 Python Pandas 将微秒转换为人类可读的日期和时间?
- java - Spring + Spring Security 请求仅接受内容类型 x-www-form-urlencoded
- azure - 连接到由混合连接管理器服务的混合连接