Sql Server Table date запрос показывает неверный результат - PullRequest
0 голосов
/ 04 октября 2018

У меня есть таблица Sql-сервера, которая содержит ниже значения даты (4 октября)

enter image description here

Теперь запрос ниже не показывает никакого результата

  select 
            *
        from [dbo].[TB_AUDIT] TBA 

        where   TBA.ActionDate >= '10/01/2018' and TBA.ActionDate <= '10/04/2018' which is not correct.

Но если я напишу, выберите * из [dbo]. [TB_AUDIT] TBA

    where   TBA.ActionDate >= '10/01/2018' and TBA.ActionDate <= '10/05/2018' it is returning me all results.

Что я делаю не так.

Ответы [ 4 ]

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

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

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

Если вы не укажете компонент времени для DATETIME, SQL Server по умолчанию установит его в полночь.Итак, в вашем первом запросе вы запрашиваете все результаты <='2018-10-04T00:00:00.000'.Все точки данных в вашей таблице больше , чем '2018-10-04T00:00:00.000', поэтому ничего не возвращается.

Вы хотите

TBA.ActionDate >= '2018-10-01T00:00:00.000' and TBA.ActionDate < '2018-10-05T00:00:00.000'`
0 голосов
/ 04 октября 2018

С этим запросом две проблемы.Во-первых, это использование локализованной строки.Для меня это выглядит так, будто он спрашивает о рядах между январем и апрелем.Однозначный формат дата - YYYYMMDD.YYYY-MM-DD сам по себе может не работать на SQL-сервере, так как он все еще зависит от языка.Литерал даты ODBC {d'YYYY-MM-DD'} также работает однозначно.

Во-вторых, параметры даты не имеют времени, которое по умолчанию равно 00:00.Сохраненные даты имеют элемент времени, что означает, что они находятся за пределами диапазона поиска, даже если параметр даты был распознан.

Запрос должен измениться на:

select 
        *
from [dbo].[TB_AUDIT] TBA 
where   
    cast(TBA.ActionDate as date) between '20181001' and '20181004'

или

    cast(TBA.ActionDate as date) between {d'2018-10-01'} and {d'2018-10-04'}

Обычно применение функции к полю не позволяет серверу использовать какие-либо индексы.SQL Server достаточно умен, чтобы преобразовать его в запрос, охватывающий всю дату, по сути аналогичный

where   
    TBA.ActionDate >='2018:10:01T00:00' and TBA.ActionDate <'2018-10-05T00:00:00'
0 голосов
/ 04 октября 2018

Используйте правильно отформатированные даты!

select *
from [dbo].[TB_AUDIT] TBA 
where TBA.ActionDate >= '2018-10-01' and TBA.ActionDate <= '2018-10-04' 

ГГГГ-ММ-ДД - это не просто хорошая идея.Это стандарт ISO для форматов даты, признанный большинством баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...