如何使用Dateadd和DateDiff在SQL中编写变量来查找上个月的最后两天

问题描述 投票:1回答:2

我正在尝试使用显示上个月最后两天的dateadd和datediff来编写变量。一个变量将是上个月的倒数第二天,即我遇到麻烦的变量。另一个将是上个月的最后一天,也就是我能得到的那一天。我正在使用SQL Server。

我已经尝试在Stack上寻找它,我只看到了上个月的最后一天,而不是第二天到最后一天。我试着学习dateadd和datediff,(我仍然想做)。

这是我到目前为止所尝试的:

Declare @CurrentMonth as date = '3/1/2019'
Declare @SecLastDayPrevMonth as date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @currentmonth), -2) 
Declare @LastDayPrevMonth as date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @currentmonth), -1) 

我得到的seclastdayPrevMonth的结果是2/28/2019。相反,我想要2/27/2019

我也在2/28/2019获得lastdayprevmonth,这就是我想要的。

我正在编写变量,因为当前月份将每月更改,而不是必须更新我在查询中需要的其他日期,我想使用变量,所以我只更新当前月份,其他一切都在流经。

并解释为什么我的dateadd / datediff是错误的,并解释为什么正确的dateadd / datediff是它的方式,将是非常有帮助的

sql sql-server datediff dateadd
2个回答
3
投票

为什么不在计算最后一天计算的最后一天?另外,你使用DATEADD非常奇怪。语法是DATEADD(interval, increment, datetime)

Declare @recmonth as date = '3/1/2019'
Declare @LastDayPrevMonth as date = EOMONTH(DATEADD(MONTH, -1, @RecMonth))
Declare @SecLastDayPrevMonth as date = DATEADD(DAY, -1, @LastDayPrevMonth)


SELECT @SecLastDayPrevMonth, @LastDayPrevMonth

因此,我们可以通过从日期减去一个月然后调用EOMONTH来计算上个月的最后一天,SecLastDayPrevMonth LastDayPrevMonth ------------------- ---------------- 2019-02-27 2019-02-28 返回给定月份的最后一天。然后倒数第二天就是减去一天。

产量:

DATEDIFF()

0
投票

至于“为什么”,datepart有3个参数:startdate(特定日期部分的字符串表示),enddate0(两者都必须可转换为date-ish对象)。

1/1/1900本质上是SQL的时代,在这种情况下是3/1/2019。所以0和DATEADD()之间的月份差异是(119 * 12)+2(+ 2因为我们排除3月,因为我们没有计算整月)= 1430个月的差异。

然后,我们试图为我们的价值增加2个月。 datepart有3个参数:numberdate@LastDayPrevMonth。但是,在这个例子中,你将1430个月添加到-2转换为的日期(在这种情况下,我相信它将是12/30/1899,或者在纪元之前的2天)。所以,1899年12月30日之后的1430个月将是2/30/2019,但是2月只有2019年的28天,所以它返回2/28/2019。在闰年,它可能会在2/29/2019返回。

要使你的@SecLastDayPrevMonthDATEDIFF()只有DATEADD()DATEADD(month,DATEDIFF(month,0,@CurrentDate),0),你只需稍微改变你的计算。

您要做的第一件事就是找到您所在月份的第一天。这可以用DECLARE @CurrentDate date = '2019-03-15' ; -- Changed it to something in the middle of the month. DECLARE @FirstDayOfGivenMonth = DATEADD(month,DATEDIFF(month,0,@CurrentDate),0) ; -- 3/1/2019 DECLARE @LastDayOfPrevMonth date = DATEADD(day,-1,@FirstDayOfThisMonth) ; -- 2/28/2019 DECLARE @SecLastDayOfPrevMonth date = DATEADD(day, -2, @FirstDayOfThisMonth) ; -- 2/27/2019 SELECT @LastDayOfPrevMonth AS LDPM, @SecLastDayOfPrevMonth AS SLDPM ; DECLARE @FourDaysLeftInPrevMonth date = DATEADD(day, -4, @FirstDayOfThisMonth) ; -- 2/25/2019 SELECT @FourDaysLeftInPrevMonth AS FourDaysLeftPrev ; 完成。我们基本上使用上面用过的相同的东西来计算自纪元以来的月数,但接下来我们将这几个月添加回时代。

现在我们知道了给定月份的第一天,我们所要做的就是从上个月减去天数。

所以,

EOM()

当然,从SQL 2012开始,使用qazxswpoi函数可以更轻松地完成这一操作,直到一个月的最后一天。但是,如果您只能使用原始问题中的两个原始函数,那么这将是获得所需值的一种方法。

© www.soinside.com 2019 - 2024. All rights reserved.