月份

时间:2016-06-02 12:05:55

标签: sql sql-server database

我需要帮助解决我的小问题。

 SELECT FORMAT(ServiceDate, 'dd-MM-yyy") AS ServiceDate
 FROM Services
   WHERE Day(ServiceDate) BETWEEN '1' AND Day(getdate() -2)
   AND Month(ServiceDate) = 
     CASE 
        WHEN Day(getdate()) <=2 
        THEN Month(getdate() -1 
        ELSE Month(getdate()) 
     END
   AND Year(ServiceDate) = Year(getdate())

现在问题是本月的第一个和第二个问题。 查询不使用上个月。它显示了实际的月份。

我希望它清楚我需要什么。

如果我们有01-06-2016并且我需要减2,那么查询必须让我回到30-05-2016那天

大THX

今天使用此查询的输出

output query

3 个答案:

答案 0 :(得分:1)

假设您使用的是sql-server,则需要使用DATEADD(Day, -2, GETDATE())从当前日期减去2天。

答案 1 :(得分:1)

我想我现在理解逻辑了:

  • 如果当天是当月的第一,请从上个月开始,直至结束前2天获取所有记录。
  • 如果当天是当月的第二,请从上个月的开头获取所有记录,直至结束前一天。
  • 如果当天是当月的第3个或更高,请从当月的开头获取所有记录,直到2天前。

由于您使用的是2012版本中引入的FORMAT()功能,因此您还可以使用同一版本中引入的EOMONTH()功能。
此函数返回作为参数接收日期月末的日期,并且还有一个有用的可选第二个参数,指定要添加到传递给函数的日期的月数。 使用此函数将允许您在不使用ServiceDate列上的任何函数的情况下编写查询,从而允许使用此列上定义的任何索引。

DECLARE @Now datetime = GETDATE()

SELECT FORMAT(ServiceDate, 'dd-MM-yyy') AS ServiceDate
FROM Services
WHERE (
    DAY(@Now) <= 2 
    AND ServiceDate >= DATEADD(DAY, 1, EOMONTH(@Now, -2))
    AND ServiceDate < DATEADD(DAY, -(DAY(@Now)-1), EOMONTH(@Now, -1))
)
OR
(
    DAY(GETDATE()) > 2 
    AND ServiceDate >= DATEADD(DAY, 1, EOMONTH(@Now, -1))
    AND ServiceDate < DATEADD(DAY, -2, @Now)
)

答案 2 :(得分:0)

在getdate()前2天计算enddate,并在enddate的第一个月和enddate的间隔中选择数据。

 SELECT FORMAT(ServiceDate, 'dd-MM-yyy") AS ServiceDate
 FROM Services
 CROSS APPLY (SELECT enddate = DATEADD(D,-2,getdate()) x
   WHERE ServiceDate BETWEEN DATEADD(MONTH,DATEDIFF(MONTH,0,x.enddate),0) AND x.enddate