【发布时间】:2018-01-05 01:42:00
【问题描述】:
我有以下 SQL 语句,大部分情况下它对我有用,至少我是这么认为的。我需要以 MM/DD/YYYY 格式返回上个月的第一天。现在我们进入了新的一年(特别是一月),这是不正确的。
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/2018”,我需要的日期是上一年的上个月的第一天。所以它将是“06/01/2017”。对于“01/03/2018”,它将是“12/01/2017”。但我的声明带回了“2016 年 12 月 1 日”。
我的逻辑有什么问题?
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'
【问题讨论】:
-
您的逻辑有问题的是您当前的结果是正确的。 2018的上一年是2017,所以现在你站在2017年1月,上个月是2016年12月
标签: sql sql-server