声明一个日期是另一个日期的最后一个月

Declaring a date as being the last month day of another date

我正在尝试使用 SQL Server Studio 在我们的 SAP B1 系统上编写财务报告。

在我的报告中,我希望按月计算信息。在我的报告中,我的@start date 为@Startofcurrentfinancialyear,结束日期为 DD+30(因为这个月有 31 天)但是我想要 mm+1 和 dd-1 将我带到最后一天这个月。

我计划更改每个月的报告以提供以下信息。 MM+1(第 2 个月)和 MM+2 - DD 1 给我第 2 个月的日期范围等

目前,我可以根据以下条件进行操作:MM+0、DD+30,然后继续执行 DD+60 等并计算每个月有多少天,但这会给我带来问题有闰年。

DECLARE @Start DATETIME = DATEADD(MM,-0,@StartOfCurrentFinancialYear)
DECLARE @End DATETIME = DATEADD(DD,+30,@StartOfCurrentFinancialYear)

我希望能够为每个部分定义一个月份,并根据上面给出的参数给出定义月份的最后一天。

如果你想要月底,那么在所有支持的SQL服务器版本中,你可以这样做:

DECLARE @Start DATETIME = DATEADD(MONTH, -0, @StartOfCurrentFinancialYear);
DECLARE @End DATETIME = EOMONTH(@StartOfCurrentFinancialYear);

如果您使用的是不受支持的版本,您可以进行日期运算:

DECLARE @End DATETIME = DATEADD(day, -1,
                                DATEADD(month, 1,
                                        DATEADD(day,
                                                1 - DAY(@StartOfCurrentFinancialYear), 
                                                @StartOfCurrentFinancialYear
                                               ),
                                       )
                                 );

这会进行以下计算:

  • 最内层子查询 dateadd() 移动到该月的第一天。
  • 中间子查询增加一个月。
  • 外查询减1天

如果您想要月初和月底,您可以使用 DateAdd 函数来获取它,例如:

DECLARE @Start DATETIME = DATEADD(DAY, (DAY(GETDATE()) * -1) + 1, GETDATE())
DECLARE @End DATETIME = DATEADD(MONTH,1,DATEADD(DAY, DAY(GETDATE()) * -1, GETDATE()))
SELECT @Start, @End

您可以将 GETDATE() 替换为您的日期变量,因此在替换后代码应如下所示:

声明@StartOfCurrentFinancialYear 作为日期 = '31/aug/2019'

DECLARE @Start DATETIME = DATEADD(DAY, (DAY(@StartOfCurrentFinancialYear) * -1) + 1, @StartOfCurrentFinancialYear)
DECLARE @End DATETIME = DATEADD(MONTH,1,DATEADD(DAY, DAY(@StartOfCurrentFinancialYear) * -1, @StartOfCurrentFinancialYear))
SELECT @Start, @End