SQL Server - функция IsDate, возвращающая неожиданный результат - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь сделать что-то подобное

when ISDATE(u.NewValue)=1 then CONVERT(varchar,cast(u.NewValue as date),23)

Но сервер sql возвращает 1 для 2406 также, поскольку это дата, поэтому

select ISDATE('2406')

возвращает 1.

Что не так.И из-за этого я получаю вывод, подобный этому 2406-01-01, что неверно.

Каким должен быть способ проверить, является ли значение действительной датой, когда мои данные будут датой, когда они поступят в этомформат 2019-05-28 07:59:04.450, поэтому я хочу записать только этот тип данных в качестве даты.

Может кто-нибудь предложить мне подход для этого

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Ну, вы можете использовать like:

select (case when col like '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]'
             then convert(datetime, col)
        end)

В зависимости от того, как выглядит ваша колонка, вы можете ослабить требования форматирования:

select (case when col like '%-%-% %:%:%.%'
             then try_convert(datetime, col)
        end)

Я удивлен, что SQLСервер преобразует это в дату, используя только год:

try_convert(date, '2019', 121)

Формат может быть неполным.

0 голосов
/ 30 мая 2019

Будет ли это работать ??

when ISDATE(convert(date,u.NewValue))=1 then CONVERT(varchar,cast(u.NewValue as date),23)
...