我有以下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'
这是一种方式:
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
这应该工作:
SELECT CONVERT(CHAR(10),DATEADD(MONTH,DATEDIFF(MONTH, 0, getdate())-1,0),101)