DECLARE @Date DATE = '2018-09-01', @StartDate DATE, @EndDate DATE
SELECT @StartDate = DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(@Date))), @EndDate = CAST(DATEADD(DAY, -(DAY(@Date)), @Date) AS DATE)
SELECT P.productid, P.productname, O.orderdate
FROM Production.Products AS P INNER JOIN
Sales.OrderDetails AS D ON P.productid = D.productid
INNER JOIN Sales.Orders AS O ON D.orderid = O.orderid
WHERE (O.orderdate NOT BETWEEN @StartDate AND @EndDate);
в строке 1 объявляют 3 переменные даты @Date, @StartDate, @EndDate и присваивают значение случайной дате @Date наподобие '2018-09-01'
в строке 2 относительно @Date, получая дату начала и окончания как переменную.
в строке 3, где пункт добавить эти даты
Решение: с помощью этих шагов вы никогда не получите дату начала и окончания ошибки, потому что здесь вы предоставляете только одну случайную дату, а взамен у вас есть 2 даты, содержащие дату начала и окончания года + месяц.