您可以在另一个 CASE 中使用 CASE 并在 T-SQL 语句中使用 DATEADD() 函数吗?

Can you use CASE inside another CASE and DATEADD() function in a T-SQL statement?

我正在创建一个查询,它将报告工具和设备及其所需的维护状态。

我有一个栏目当前正在使用 NextDateDue 栏目并检查它与当前日期是否已过期。在查看数据后,此列不是很可靠,所以我想通过 LastDateDue(上次维护完成日期)查看维护频率(例如,每两年一次、每周一次、每月一次),添加该频率到 LastDateDue 并检查它与当前日期以确定逾期或就绪。

这是我当前的代码:

SELECT 
    MS.MaintCompletionDate, RF.ObjectType, RD.ResourceName, 
    MRB.MaintenanceReqName, MS.NextDateDue,
    CASE
        WHEN MS.NextDateDue < GETDATE() THEN 'PAST DUE'
        WHEN MS.NextDateDue IS NULL THEN 'N/A'
        ELSE 'READY'
    END AS MaintenanceStatus
FROM
    CamstarSch.ResourceDef RD
INNER JOIN 
    CamstarSch.MaintenanceStatus MS ON RD.ResourceId = MS.ResourceId
INNER JOIN 
    CamstarSch.ResourceFamily RF ON RF.ResourceFamilyId = RD.ResourceFamilyId
INNER JOIN 
    CamstarSch.AssignedMaintReq AMR ON AMR.AssignedMaintReqId = MS.AssignedMaintReqId
INNER JOIN 
    CamstarSch.MaintenanceReq MR ON AMR.MaintenanceReqId = MR.MaintenanceReqId
INNER JOIN 
    CamstarSch.MaintenanceReqBase MRB ON MRB.MaintenanceReqBaseId = MR.MaintenanceReqBaseId
ORDER BY 
    NextDateDue DESC;

我想以一种我认为类似于以下的方式来设置我的声明:

   WHEN DATEADD(CASE WHEN MRB.MaintenanceReqName IS 'Bi-Annual' THEN 'month, 6,' MS.LastDateDue) < GETDATE() THEN 'PAST DUE'

每种频率都有更多的 WHEN 子句。

这可能吗?我是不是走错了路?

根据我对你问题的理解,这就是你想要的:

WHEN
  CASE MRB.MaintenanceReqName 
    WHEN 'Bi-Annual' THEN DATEADD(month, 6, MS.LastDateDue) 
    WHEN 'Monthly' THEN DATEADD(month, 1, MS.LastDateDue) 
    WHEN 'Weekly' THEN DATEADD(week, 1, MS.LastDateDue)  
  END < GETDATE() 
THEN 'PAST DUE'

你可以把一个箱子放在另一个箱子里。或者,您可以将多个子句放入外部案例中。或者,如果您重复执行某项操作(可能根据维护频率确定到期日期),请创建一个功能。选择更适合您的数据并提高可维护性的版本。我认为,鉴于上面的例子,函数可能是最好的选择。 函数:

CREATE FUNCTION dbo.GetDueDate  (@MaintenanceReqName varchar(50), @LastDateDue date)  
RETURNS date  
AS  
BEGIN
 DECLARE @NextDueDate date;
 SELECT @NextDueDate = CASE
    WHEN MRB.MaintenanceReqName IS 'Quarterly' THEN DATEADD(month, 3, @LastDateDue)    
    WHEN MRB.MaintenanceReqName IS 'Bi-Annual' THEN DATEADD(month, 6, @LastDateDue)
    WHEN MRB.MaintenanceReqName IS 'Annual' THEN DATEADD(year, 1, @LastDateDue)
    ELSE DATEADD(day, 30, @LastDateDue)
 END NextDueDate
 return @NextDueDate
END
....
 WHEN GetDueDate(MRB.MaintenanceReqName,MS.LastDateDue) < GETDATE() THEN 'PAST DUE'

多个子句:

CASE
    WHEN MS.NextDateDue < GETDATE() AND MRB.MaintenanceReqName IS 'Bi-Annual' THEN 'PAST DUE'
    WHEN MS.NextDateDue IS NULL THEN 'N/A'
    ELSE 'READY'
END AS MaintenanceStatus