我有以下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'时,而不是得到' 2017-12- 01',我得到2016-12-01'。
实施例。让我们说getdate()带回" 07/12/208",我需要的日期是去年的前一个月的第一天。所以它将是" 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'
答案 0 :(得分:2)
这是一种方式:
SELECT DATEADD(DAY,1,EOMONTH(GETDATE(),-2))
这是2个月前的最后一天,然后再添加一天给你一个月前的第一天。
您可以根据自己的喜好进行格式化:
SELECT FORMAT(DATEADD(DAY,1,EOMONTH(GETDATE(),-2)),'MM/dd/yyyy')
修改强>
对于澄清的问题,您有两个不同的条件。我只想使用CASE
语句来区别对待January条件:
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
答案 1 :(得分:0)
这应该有效:
SELECT CONVERT(CHAR(10),DATEADD(MONTH,DATEDIFF(MONTH, 0, getdate())-1,0),101)