Получение ошибки преобразования строки при попытке исключить месяц - PullRequest
0 голосов
/ 17 сентября 2018

Итак, я все еще изучаю все тонкости SQL и пытаюсь понять, что я делаю неправильно.

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 '2015-09-01' AND '2015-09-31');

Выдает следующую ошибку:

Ошибка преобразования при преобразовании даты и / или времени из символа строка.

Любая помощь с этим будет оценена.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Я бы настоятельно рекомендовал вам не использовать BETWEENNOT BETWEEN) с типами данных дата / время.У Аарона Бертрана есть очень хороший блог, объясняющий причины: Что общего между Между и Дьяволом? .

SELECT P.productid, P.productname, O.orderdate
FROM Production.Products P INNER JOIN
     Sales.OrderDetails D
     ON P.productid = D.productid INNER JOIN
     Sales.Orders O
     ON D.orderid = O.orderid
WHERE O.orderdate < '2015-09-01' OR
      O.orderdate >= '2015-10-01';
0 голосов
/ 17 сентября 2018
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 даты, содержащие дату начала и окончания года + месяц.

0 голосов
/ 17 сентября 2018

Предполагая, что orderdate является датой / датой, вы должны получить следующую ошибку:

Преобразование типа данных varchar в тип данных datetime привело к потередиапазон значений.

Это потому, что В сентябре 30 дней, а не 31 .Измените на 2018-09-30.

Или лучше используйте функцию EOMONTH():

SELECT EOMONTH('2019-02-01')
-- 2019-02-28
SELECT EOMONTH('2020-02-01')
-- 2020-02-29 because 2020 is a leap year

Или даже лучше, не используйте BETWEEN:

WHERE NOT (O.orderdate >= '2015-09-01' AND O.orderdate < '2015-10-01')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...