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

时间:2018-01-03 19:46:49

标签: sql sql-server

我有以下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'

2 个答案:

答案 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)