Почему преобразование поля varchar в дату не работает? - PullRequest
0 голосов
/ 14 марта 2020
    Select v.VendorCode VendorCode, V.VendorName
        where
        vi.Vendor_ID= 154 
        and 
        vi.Company_ID= (Select CompanyID from Company where CompanyID= '2')
        AND 
        (   Cast(vi.InvoiceDate as date) between Cast('3/1/2011' as date)
            AND cast('3/29/2018' as date)
        )

когда я включаю часть даты .. она не возвращает результат. InvoiceDate сохраняется как varchar в таблице и сохраняет даты, такие как 1/22/2019.

. Я не могу изменить тип, потому что это устаревшая база данных, и ее необходимо изменить в тыс. мест.

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Возможно, вам не удастся изменить данные в базе данных , но вы, по крайней мере, можете привыкнуть использовать правильные форматы даты для своих запросов.

Во-первых, используйте convert с форматом 101 для преобразования. Используйте try_convert(), если кто-то неправильно понял дату.

Во-вторых, используйте 'YYYYMMDD' или 'YYYY-MM-DD' для констант даты:

try_convert(date, v.InvoiceDate, 101) between '20110301' and '20180329'

Наконец, вы можете добавить вычисляемый столбец, так что Вы можете начать переход на лучший код:

alter table v add InvoiceDate_Date as (try_convert(date, vi.InvoiceDate, 101));

Затем вы можете написать логи c как:

InvoiceDate_date between '20110301' and '20180329'
0 голосов
/ 14 марта 2020

Для отладки попробуйте посмотреть, что СУБД видит при фильтрации по дате:

Select
    v.VendorCode
    , v.VendorName
    , cast(vi.InvoiceDate as date) as InvoiceDate
    , cast('3/1/2011' as date) as FromDate
    , cast('3/29/2018' as date) as ToDate
from ...
where
    vi.Vendor_ID = 154 
    and vi.Company_ID= (Select CompanyID from Company where CompanyID= '2')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...