我正在尝试使用显示上个月最后两天的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是它的方式,将是非常有帮助的
为什么不在计算最后一天计算的最后一天?另外,你使用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()
至于“为什么”,datepart
有3个参数:startdate
(特定日期部分的字符串表示),enddate
,0
(两者都必须可转换为date-ish对象)。
1/1/1900
本质上是SQL的时代,在这种情况下是3/1/2019
。所以0和DATEADD()
之间的月份差异是(119 * 12)+2(+ 2因为我们排除3月,因为我们没有计算整月)= 1430个月的差异。
然后,我们试图为我们的价值增加2个月。 datepart
有3个参数:number
,date
,@LastDayPrevMonth
。但是,在这个例子中,你将1430个月添加到-2转换为的日期(在这种情况下,我相信它将是12/30/1899,或者在纪元之前的2天)。所以,1899年12月30日之后的1430个月将是2/30/2019,但是2月只有2019年的28天,所以它返回2/28/2019。在闰年,它可能会在2/29/2019返回。
要使你的@SecLastDayPrevMonth
和DATEDIFF()
只有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函数可以更轻松地完成这一操作,直到一个月的最后一天。但是,如果您只能使用原始问题中的两个原始函数,那么这将是获得所需值的一种方法。