GETDATE () - n по сравнению с datetime2 (7) исключает совпадающее значение - PullRequest
0 голосов
/ 17 мая 2018

У меня есть ситуация, когда запрос поля datetime2 (7) с помощью GETDATE () - n не возвращает ожидаемый результат.

Запрос с> = GEDATE () - 20 возвращает все даты, кроме 4/27 (если выполняется сегодня 5/17) Запрос с> = 27.04.2017 возвращает все даты, включая 4/27.

Это как-то связано с timepart? даже если время составляет все 0?

DECLARE @MinDate DATE = '04-01-2018',
        @MaxDate DATE = '05-17-2018';

SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        DateCol = CAST(DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) AS DATETIME2(7))
INTO #temp
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

--SELECT * FROM #temp

SELECT COUNT(*) FROM #temp WHERE DateCol >= GETDATE()-20
SELECT COUNT(*) FROM #temp WHERE DateCol >= '2018-04-27'                --excludes the date 4/27

/*
SELECT * FROM #temp WHERE DateCol >= GETDATE()-20   --Excludes 4/27
SELECT * FROM #temp WHERE DateCol >= '2018-04-27'   --Expected output includes 4/27
*/
DROP TABLE #temp

1 Ответ

0 голосов
/ 17 мая 2018

Это связано с тем, что 2018-04-27 00:00:00.0000000 не превышает GETDATE()-20.

GETDATE()-20 даст что-то вроде '2018-04-27 10:25:37.680'

Для одного случая вы используете только дату, а для другого сценария это дата и время.

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

SELECT COUNT(*) FROM #temp WHERE DateCol >= cast(GETDATE() -20 as date)
...