簡體   English   中英

您可以在 T-SQL 語句中的另一個 CASE 和 DATEADD() 函數中使用 CASE 嗎?

[英]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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM