У меня проблемы с сортировкой некоторых дат по 3 различным диапазонам дат и возвращением значений в соответствии с правильным диапазоном. Я надеюсь, что вы можете дать мне эффективный и чистый способ сделать это.
У меня есть 6 различных дат, которые я получаю из таблицы SQL. Эти даты затем сохраняются в переменных. Все даты также могут иметь нулевое значение. Мои даты разделены на 3 диапазона дат. Я хочу вернуть указание того, в каких диапазонах я нахожусь, используя самую раннюю дату начала во всех моих диапазонах. Дата правильного диапазона также должна быть меньше текущей даты. Диапазон дат также может состоять только из даты окончания. В этом случае мы посчитали, что диапазон заканчивается на дату окончания и активен до этого. В этом случае мы выбираем самую раннюю дату окончания, близкую к текущей дате.
Возвращает 0, если все даты равны нулю
Диапазон # 1 (Категория # 1) X Дата начала и Xдата окончания возврата 1
диапазон № 2 (категория № 2) Y дата начала и дата окончания Y возвращение 2
диапазон № 3 (категория № 3) Z дата начала и дата окончания Z возвращение 3
РЕДАКТИРОВАТЬ
Ex#1 XStart = December 10 , XEnd = December 15
YStart = December 12 , Yend = December 13
ZStart = December 9 , ZEnd = Null
Expected result would be Z Category
Ex#2 XStart = December 8 , XEnd = December 15
YStart = NULL , Yend = NULL
ZStart = December 9 , ZEnd = Null
Expected result would be X Category
Ex#3XStart = NULL , XEnd = December 15
YStart = NULL , Yend = NULL
ZStart = December 9 , ZEnd = Null
Expected result would be X Category
Ex#4 XStart = December 10 , XEnd = December 15
YStart = NULL , Yend = NULL
ZStart = December 9 , ZEnd = Null
Expected result would be Z Category
Есть ли более эффективный способ, чем делать много операторов IF? Я испытываю трудности с обработкой всех этих условий и проверок. Вот фрагмент того, что у меня есть.
--Return 0 is not Condition is Applicable
ALTER PROCEDURE [dbo].[HO_GetReason]
@HOID INT
AS
BEGIN
Declare @IsHOIDReal INT = (SELECT ID from T_HO where id = @HOID)
Declare @XStartDate Datetime
Declare @XEndDate Datetime
Declare @YStartDate Datetime
Declare @YEndDate Datetime
Declare @ZStartDate Datetime
Declare @ZEndDate Datetime
CREATE TABLE #tmpT_HO_Withhold (
ID INT NOT NULL,
XStartDate Datetime null,
XEndDate Datetime null,
YStartDate Datetime null,
YEndDate Datetime null,
ZStartDate Datetime null,
ZEndDate Datetime null,
PRIMARY KEY CLUSTERED (ID)
)
IF (@IsHOIDReal IS NOT NULL)
BEGIN
INSERT INTO #tmpT_HO_Withhold
SELECT T_HO.ID,
XStartDate ,
XEndDate ,
YStartDate ,
YEndDate ,
ZStartDate ,
ZEndDate
FROM dbo.T_HO
WHERE ID = @HOID
SET @XStartDate = (Select TOP 1 XStartDate from #tmpT_HO_Withhold)
SET @XEndDate = (Select TOP 1 XEndDate from #tmpT_HO_Withhold)
SET @YStartDate = (Select TOP 1 YStartDate from #tmpT_HO_Withhold)
SET @YEndDate = (Select TOP 1 YEndDate from #tmpT_HO_Withhold)
SET @ZStartDate = (Select TOP 1 ZStartDate from #tmpT_HO_Withhold)
SET @ZEndDate = (Select TOP 1 ZEndDate from #tmpT_HO_Withhold)
IF(@XStartDate IS NULL AND @YStartDate IS NULL AND @ZStartDate IS NULL)
BEGIN print 'NO CONDITION' Select 0 as 'HO_GetReason' END
ELSE IF (@XStartDate IS NOT NULL AND @YStartDate IS NULL AND @ZStartDate IS NULL) BEGIN print '1' Select 1 as 'HO_GetReason'END
ELSE IF (@XStartDate IS NOT NULL AND @YStartDate IS NULL AND @ZStartDate IS NULL) BEGIN print '2' Select 2 as 'HO_GetReason'END
ELSE IF (@XStartDate IS NULL AND @YStartDate IS NULL AND @ZStartDate IS NOT NULL) BEGIN print '3' Select 3 as 'HO_GetReason'END
END
DROP TABLE #tmpT_HO_Withhold END