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
今天使用此查询的输出
答案 0 :(得分:1)
假设您使用的是sql-server,则需要使用DATEADD(Day, -2, GETDATE())
从当前日期减去2天。
答案 1 :(得分:1)
我想我现在理解逻辑了:
由于您使用的是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