Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Dateadd和DateDiff在SQL中编写变量以查找上个月的最后两天_Sql_Sql Server_Datediff_Dateadd - Fatal编程技术网

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

如何使用Dateadd和DateDiff在SQL中编写变量以查找上个月的最后两天,sql,sql-server,datediff,dateadd,Sql,Sql Server,Datediff,Dateadd,我正在尝试使用dateadd和datediff编写一个变量,它显示上个月的最后两天。其中一个变量是上个月的第二天到最后一天,我遇到了麻烦。另一个是上个月的最后一天,我能得到的。我正在使用SQL Server 我试着在堆栈上寻找它,我只看到上个月的最后一天,而不是第二天到最后一天。我试着学习dateadd和datediff(我仍然想这样做) 这就是我迄今为止所尝试的: Declare @CurrentMonth as date = '3/1/2019' Declare @SecLastDayPre

我正在尝试使用dateadd和datediff编写一个变量,它显示上个月的最后两天。其中一个变量是上个月的第二天到最后一天,我遇到了麻烦。另一个是上个月的最后一天,我能得到的。我正在使用SQL Server

我试着在堆栈上寻找它,我只看到上个月的最后一天,而不是第二天到最后一天。我试着学习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) 
我上个月第二天得到的结果是2019年2月28日。相反,我想要2019年2月27日

我也得到了2019年2月28日的最后一天,这是我想要的

我写变量是因为当前月份每个月都会发生变化,我不需要在查询中更新其他需要的日期,而是希望使用变量,因此我只更新当前月份,其他所有内容都在进行中


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

为什么不在计算第二个最后一天时参考最后一天?另外,您使用的
DATEADD
非常奇怪。语法是
DATEADD(间隔、增量、日期时间)

因此,我们可以通过从日期中减去一个月,然后调用
EOMONTH
,返回给定月份的最后一天,来计算上个月的最后一天。那么最后的第二天就是减去一天

收益率:

SecLastDayPrevMonth LastDayPrevMonth
------------------- ----------------
2019-02-27          2019-02-28
至于“为什么”,DATEDIFF()接受3个参数:
datepart
(特定日期部分的字符串表示)、
startdate
enddate
(两者都必须可转换为日期对象)

0
本质上是SQL的时代,在本例中是
1/1/1900
。因此,0和2019年1月3日之间的月差为(119*12)+2(+2,因为我们排除了3月份,因为我们没有计算整月差)=1430个月

然后,我们试图增加2个月的价值
DATEADD()
接受3个参数:
datepart
number
date
。但是,在本例中,您将在-2转换为的任何日期上添加1430个月(在本例中,我相信它将是1899年12月30日,或者是纪元前2天)。因此,1899年12月30日之后的1430个月将是2019年2月30日,但2019年2月只有28天,因此它将返回2019年2月28日。在闰年,它可能会回到2019年2月29日

要仅使用
DATEDIFF()
DATEADD()
获取您的
@LastDayPrevMonth
@SecLastDayPrevMonth
,只需稍微更改您的计算

你要做的第一件事就是找到你指定月份的第一天。这可以通过
DATEADD(month,DATEDIFF(month,0,@CurrentDate),0)
完成。我们基本上使用了和上面相同的东西来计算自epoch以来的月数,但是我们将这些月加回到epoch

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

所以


诚然,自SQL 2012以来,使用
EOM()
函数可以轻松地完成这一切,直到一个月的最后一天。但是,如果您只能使用原始问题中的两个原始函数,这将是获得所需值的一种方法。

什么是@recmonth?哎呀,对不起,当您看到recmonth时,它应该是currentmonth,我现在可以更改它。哇,我完全忘记了EOMONTH函数。前一段时间我在我的另一个变量中使用了这个,然后就空白了。我觉得我的dateadd看起来很不稳定,但我从一个网站上得到了这个,它似乎起了作用,所以我就这么做了。然而,当尝试学习dateadd时,看起来并不正确,但因为它对其中一个用户有效,我认为是我没有正确阅读它。我一定会学习dateadd和datediff,以便熟悉它。谢谢
SecLastDayPrevMonth LastDayPrevMonth
------------------- ----------------
2019-02-27          2019-02-28
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 ;