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