获取上个月和上一年度的日期?

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

我有以下SQL语句,大部分都是为我工作,或者我认为。我需要以MM / DD / YYYY格式返回上个月的第一天。现在我们进入新的一年(特别是1月),这是不正确的。

SELECT convert(char(10),DATEADD(year,-1,DATEADD(month, DATEDIFF(MONTH, 0, getdate())-1, 0)),120) AS LastYearFirstOfPreviousMonth

如果我在2月1日使用它,那么它很棒!

SELECT convert(char(10),DATEADD(year,-1,DATEADD(month, DATEDIFF(month, 0, '2018-02-01')-1, 0)),120) AS LastYearFirstOfPreviousMonth

同样如果它是'2018-03-01'等等。但是当我使用'2018-01-01'时,我得到'2016-12-01'而不是'2017-12-01'。

防爆。让我们说getdate()带回“07/12/2018”,我需要的日期是前一个月的第一年的前一年。所以这将是“06/01/2017”。对于“01/03/2018”,它将是“12/01/2017”。但我的声明带回了“12/01/2016”。

我的逻辑出了什么问题?

SP摘录如下:

SELECT c.ClientID ... 
INTO PC_Benefits_Expired 
from Client_Program cp 
INNER JOIN .... 
WHERE (CAST(cp.startdate AS DATE) >= CAST(DATEADD(year,-1,DATEADD(month, DATEDIFF(month, 0, getdate()), 0)) AS DATE) 
--OR 
--FirstDayOfCurrentMonthPriorYear CAST(cp.startdate AS DATE) >= CAST(DATEADD(year,-1,DATEADD(month, DATEDIFF(month, 0, getdate())-1, 0)) AS DATE)) 
--FirstDayOfLastMonthPriorYear and CAST(cp.EndDate AS DATE) <= CAST(DATEADD(day,-1,DATEADD(month, DATEDIFF(month, 0, GETDATE())+1, 0)) AS DATE) 
--LastDayOfCurrentMonthCurrentYear and CAST(cp.EndDate AS DATE)='2017-02-28'
sql sql-server
2个回答
2
投票

这是一种方式:

SELECT DATEADD(DAY,1,EOMONTH(GETDATE(),-2))

这是从2个月前的最后一天,然后增加一天给你一个月前的第一天。

你可以随意格式化:

SELECT FORMAT(DATEADD(DAY,1,EOMONTH(GETDATE(),-2)),'MM/dd/yyyy')

编辑:

对于澄清的问题,您有两个不同的条件。我只想使用CASE语句来处理1月条件:

SELECT CASE WHEN DATEPART(MONTH,GETDATE()) = 1
            THEN DATEADD(DAY,1,EOMONTH(GETDATE(),-2))
            ELSE DATEADD(YEAR,-1,DATEADD(DAY,1,EOMONTH(GETDATE(),-2)))
       END AS LastYearFirstOfPreviousMonthDATEADD

0
投票

这应该工作:

SELECT CONVERT(CHAR(10),DATEADD(MONTH,DATEDIFF(MONTH, 0, getdate())-1,0),101)
© www.soinside.com 2019 - 2024. All rights reserved.