SQL - Объяснение преобразования даты в числа и проверки, находится ли параметр в диапазоне - PullRequest
0 голосов
/ 18 июня 2020

Я адаптирую некоторый код и нашел этот запрос:

SELECT <some columns>
FROM sample_table AS M
WHERE YEAR(@BETWEEN_DATE) * 365 + MONTH(@BETWEEN_DATE) * 30 + DAY(@BETWEEN_DATE)
BETWEEN (
       YEAR(M.STARTINGDATE) * 365 + MONTH(M.STARTINGDATE) * 
       30 + DAY(M.STARTINGDATE)
   )
   AND 
   CASE 
        WHEN M.ENDINGDATE IS NULL THEN (
                 YEAR('99990101') * 365 + MONTH('99990101') * 30 + DAY('19000101')
             )
        ELSE (
                 YEAR(M.ENDINGDATE) * 365 + MONTH(M.ENDINGDATE)
                 * 30 + DAY(M.ENDINGDATE)
             )
   END

Из предыдущего запроса параметр @BETWEEN_DATE преобразован в числа, но этот logi c слишком запутан для мне, честно.

EDIT : Тип данных параметра @BETWEEN_DATE и столбцов M.STARTINGDATE и M.ENDINGDATE - DATETIME.


Я могу представить, что @BETWEEN_DATE преобразуется в число для проверки, находятся ли M.STARTINGDATE и M.ENDINGDATE между диапазоном. Эти даты начала и окончания используются таким образом для агрегирования года до значения в столбцах M.STARTINGDATE и M.ENDINGDATE; но; Я не совсем уверен.

Результат «в случае, если параметр @BETWEEN_DATE равен 2020-06-18 00:00:00.000», значения года, месяца и дня будут следующими:

DECLARE @BETWEEN_DATE DATETIME = CAST(GETDATE() AS DATE);
SELECT @BETWEEN_DATE AS FECHA, YEAR(@BETWEEN_DATE) * 365 + MONTH(@BETWEEN_DATE) * 30 + DAY(@BETWEEN_DATE) AS NUMERIC_RESULT, 
YEAR(@BETWEEN_DATE) * 365 AS _YEAR,
MONTH(@BETWEEN_DATE) * 30 AS _MONTH, 
DAY(@BETWEEN_DATE) AS _DAY;

Year: 737300
Month: 180
Day: 18

Я хочу изменить этот запрос и понять его, чтобы сделать его более разборчивым / простым для понимания.

1 Ответ

1 голос
/ 18 июня 2020

Запрос возвращает все строки таблицы, где значение переменной @BETWEEN_DATE находится между частями даты STARTINGDATE и ENDINGDATE, но делает это излишне сложным способом. Попробуйте эту упрощенную версию:

SELECT <some columns>
FROM sample_table
WHERE @BETWEEN_DATE >= CONVERT(DATE, STARTINGDATE) 
AND (ENDINGDATE IS NULL OR @BETWEEN_DATE <= CONVERT(DATE, M.ENDINGDATE))
...