Необычный результат от даты запроса SQL - PullRequest
0 голосов
/ 10 июля 2019

У меня есть следующий запрос, который должен вернуть 3 строки, однако он не возвращает ни одной.Тем не менее, если я выполню второй запрос, я получу нужные 3 строки.

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

3 строки должны быть 2019-06-18, 2019-06-06, 2019-06-17 Это возвращает ноль строк на основе текущей даты (2019-06-10)

(
    CONVERT(VARCHAR(10), Bill.InvoiceDate, 103) <= CONVERT(VARCHAR(10), DATEADD(DAY, -21, GETDATE()), 103)  
    AND 
    CONVERT(VARCHAR(10), Bill.InvoiceDate, 103) >= CONVERT(VARCHAR(10), DATEADD(DAY, -41, GETDATE()), 103) 
)

Это также дает ноль строк

(
    Bill.InvoiceDate <= DATEADD(DAY, -21, GETDATE())
    AND 
    Bill.InvoiceDate >= DATEADD(DAY, -41, GETDATE())
)

Возвращает 3 строки, показанные выше

(
    Bill.InvoiceDate <= (GETDATE()-21)
    AND
    Bill.InvoiceDate >= (GETDATE()-41)
)

Основываясь на комментарии Сами, ясделали ниже, и они возвращаются с тем же результатом

SELECT GETDATE()-21, DATEADD(DAY, -21, GETDATE())
| No column name          | No column name          |
|-------------------------|-------------------------|
| 2019-06-19 09:52:23.240 | 2019-06-19 09:52:23.240 |

1 Ответ

0 голосов
/ 10 июля 2019

Конечно, проблема с запросом 1 состоит в том, что вы сравниваете строки.

Давайте посмотрим, как выглядят 3 даты, о которых вы упомянули, когда convert изменился до nvarchar(10) в стиле 103:

06/06/2019 
17/06/2019 
18/06/2019

и ваше WHERE предложение по существу:

database_value <= '19/06/2019'
and
database_value >= '30/05/2019'

Обратите внимание, что в виде строки «30/05/2019» начинается с «3» и, таким образом, при сравнении строк оно больше, чем любое из трех упомянутых вами значений, начинающихся либо с «1», либо с «0».

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

В качестве дополнительного уведомления я действительно сомневаюсь, что первый запрос "делает то же самое", если вы удалите convert. При сравнении строки с датой приоритетность типа данных указывает, что строка автоматически конвертируется в дату.

...