Получить результат последних шести месяцев, используя DATEDIFF - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь создать запрос в SQL, который извлекает строки на основе их даты.

Я хочу получить результат за последние 6 месяцев, используя функцию DATEDIFF() (а не другую функцию), но мой запрос по-прежнему возвращает строки, которые больше GETUTCDATE().

Я использую запрос:

SELECT * FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180 

Почему я все еще получаю результаты, которые превышают GETUTCDATE()?

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Потому что если ExpiredWarranty > GETUTCDATE(), то DATEDIFF между ними возвращает отрицательное число, которое определенно меньше 180.

Попробуйте:

SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180
  AND DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) >= 0;

Или:

SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;
0 голосов
/ 04 октября 2018

DATEDIFF возвращает положительное число всякий раз, когда третий аргумент больше , чем второй.В вашем случае вам нужны записи, срок гарантии которых истек в течение 6 месяцев.С одной стороны, это 180 дней, с другой - 0 дней.Если срок действия гарантии истекает в future , ваш текущий вызов DATEDIFF вернет отрицательный номер.

Чтобы это исправить, просто ограничьте вывод DATEDIFFот 0 до 180 дней, и не допускайте отрицательных различий:

SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;
0 голосов
/ 04 октября 2018

Во-первых, вы можете подумать, что хотите использовать datediff, но тот факт, что вы используете его (или любую другую функцию) для столбца, делает невозможным использование SQL Server каких-либо индексов, определенных с этимстолбец - и это может быть реальным штрафом за производительность.

Во-вторых, причина, по которой вы получаете записи для будущих дат, заключается в том, что если первая дата позже второй, функция DateDiff вернетотрицательное число.Все известные мне отрицательные числа меньше 180.

Лучший запрос будет такой:

SELECT * 
FROM CARS
WHERE c.ExpiredWarranty <= GETUTCDATE()
-- If you want 6 months, don't bother with days...
AND c.ExpiredWarranty > DATEADD(MONTH, -6, GETUTCDATE()) 
0 голосов
/ 04 октября 2018
  • Попробуйте:

    WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) >= 0 AND DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180

  • Или:

    WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;

...