SQL Server - значение передает ISDATE (), но не в состоянии CAST как DATE или DATETIME - PullRequest
0 голосов
/ 14 января 2019

В моей таблице базы данных есть столбец varchar, в строке, которую я хотел бы вернуть, он заполняется как '2018-12-26T00:00:00.000' (мои кавычки не включены в фактическое значение). Когда я пытаюсь запросить это значение, когда оно является действительной датой, например

SELECT
    myValue
FROM 
    myTable
WHERE
    ISDATE(myValue) = 1

возвращается правильно. Однако мне нужно, чтобы это значение было преобразовано в DATE. Когда я пытаюсь что-то вроде этого:

SELECT
    CAST(myValue AS DATE) AS myValueFormatted
FROM 
    myTable
WHERE
    ISDATE(myValue) = 1

Я получаю ошибку

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

Есть ли другой способ, которым я могу преобразовать это varchar значение в Date?

ОБНОВЛЕНИЕ: я заметил, что, попробовав несколько разных вещей, мне кажется, что запрос подходит для меня, используя значение в качестве даты для чего-либо (DATEDIFF, CONVERT обратно в строку и т. Д.) В части выбора , но попытка что-либо сделать с этим в предложении WHERE вызывает ошибку. Чтобы ничто иное не мешало, я создал временную таблицу, содержащую только 1 строку со значением данных выше, и выполнение запроса только по этому одному значению выдает ошибку

ОБНОВЛЕНИЕ 2: Хорошо, я понятия не имею, почему это исправляет это, но это - то, что я нашел. Когда я бегу

SELECT
    myValue
FROM
    myTable
WHERE
    TRY_CONVERT(DATE, myValue) IS NOT NULL

возвращает ТОЧНО те же значения, что и

SELECT
    myValue
FROM 
    myTable
WHERE
    ISDATE(myValue) = 1

Однако, когда я затем добавляю AND CAST(myValue AS DATE) < GETDATE() к каждому предложению WHERE, работает только первый. Я понимаю, почему TRY_CONVERT безопаснее в использовании, я до сих пор не уверен, почему он работает над GETDATE ()

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы также можете просто попробовать что-то вроде этого:

SELECT CAST(LEFT(MyValue, 10) AS DATE)

Если это все еще не работает, у вас есть проблемы с форматированием ваших данных.

0 голосов
/ 14 января 2019

Я не могу воспроизвести вашу ошибку ...

declare @dt varchar(256) = '2018-12-26T00:00:00.000' select cast(@dt as date)

Итак, там должно быть еще одно мошенническое значение, которое нельзя конвертировать.

Чтобы определить, какое значение вызывает проблему в версиях <2012, выполните следующее: </p>

SELECT
myValue
FROM myTable
WHERE
ISDATE(myValue) = 0

Примечание. ISDATE является детерминированным, только если вы используете его с функцией CONVERT, если указан параметр стиля CONVERT, а style не равен 0, 100, 9 или 109.

Для 2012 года используйте TRY_CONVERT

SELECT
*
FROM myTable
WHERE
TRY_CONVERT(date, myValue) IS NULL
...