您可以在另一个 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
我正在创建一个查询,它将报告工具和设备及其所需的维护状态。
我有一个栏目当前正在使用 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