SQL возвращает значение в зависимости от 3 диапазонов дат - PullRequest
0 голосов
/ 22 декабря 2019

У меня проблемы с сортировкой некоторых дат по 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
...