首页 > 解决方案 > 如果未提供日期,则返回最近 6 个月的记录或自提供日期起最近 6 个月的记录

问题描述

我有一个存储过程,如果没有提供日期,它会返回过去 6 个月的所有记录,但我还希望它做的是从提供日期的日期返回过去 6 个月的记录。

如果没有提供日期,则使用下面的代码示例,那么我希望查看 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)

标签: sql-servertsqlstored-procedures

解决方案


这里的逻辑似乎是您希望从事件日期(如果不为空)或从现在开始(如果事件日期为空)获取最近 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())

推荐阅读