我有一个存储过程,如果没有提供日期,它将返回过去6个月的所有记录,但是我还希望做的是从提供日期起返回最近6个月的记录。< / p>
使用下面的代码示例(如果未提供日期),那么我想查看2月到7月的记录。但是,如果按照下面的代码提供了日期,那么我希望能够看到从8月到7月的记录。
DECLARE @IncidentDate DATE = null
DECLARE @EmpCode INT = 6000
SET @IncidentDate = '2018-02-05'
SELECT EmpCode
,BonusDate
,BonusYear
,BonusPeriod
,GradesScore
,Bonus
FROM Bonus B
WHERE B.EmpCode = @EmpCode
AND BonusDate >= DATEADD(MONTH, DATEDIFF(Month, 0, DATEADD(m, -6, current_timestamp)), 0)
答案 0 :(得分:2)
这里的逻辑似乎是,您要从事件发生日期(如果不为空)或从现在开始(如果事件日期为空)从最近6个月开始记录。因此,我认为我们可以将输入日期汇总到现在,以获得您想要的行为:
SELECT ...
FROM Bonus B
WHERE B.EmpCode = @EmpCode AND
BonusDate >= DATEADD(month, -6, COALESCE(@IncidentDate, GETDATE()));
如果您希望截止日期实际上是今天的午夜,请使用CONVERT(date, GETDATE())
而不是GETDATE()
。
编辑:如果只需要六个月的窗口,请使用此WHERE
子句:
WHERE B.EmpCode = @EmpCode AND
BonusDate BETWEEN DATEADD(month, -6, COALESCE(@IncidentDate, GETDATE())) AND
COALESCE(@IncidentDate, GETDATE())