Почему сообщение об ошибке преобразования SQL (дата) не удалось в некоторых случаях, но не в других? - PullRequest
0 голосов
/ 20 сентября 2018

У меня возникла очень странная проблема с SQL-запросом, когда я получаю сообщение об ошибке «Преобразование не удалось при преобразовании даты и / или времени из символьной строки».неожиданно (ну, я этого не ожидал), но с разными манипуляциями с запросом некоторые из них работают, а другие нет.Итак, у меня есть рабочее решение, но я хочу понять, почему некоторые пути не работают, а некоторые - нет.

Справочная информация: myTable - это таблица с myDateAsString, которая содержит даты в виде строк в формате дд / мм / гггг.Я не могу изменить это или изменить структуру базы данных в любом случае, но хочу извлечь некоторые данные как даты для обработки.

Извлечение начальных данных: это работает (но не имеет требуемого предложения WHERE дляузкие данные (я ожидал бы, что если бы были данные, которые не были бы преобразованы, то это привело бы к ошибке здесь)

SELECT CONVERT(date, myDateAsString, 103) as myDate
FROM   myTable

Добавление предложения WHERE: я хочу получить только те данные, которые «в будущем»; так как приведенный выше запрос работает, я ожидал бы, что это также будет работать, но он выдает ошибку «Преобразование не выполнено при преобразовании даты и / или времени из символьной строки».

SELECT *
FROM (
     SELECT CONVERT(date, myDateAsString, 103) as myDate
     FROM   myTable) as ConvertedData
WHERE myDate > GETDATE()

Существует ли причина для этогоне получается? Все данные выглядят как правильные даты (особенно потому, что вышеприведенный запрос «первоначального извлечения данных» не завершается неудачей.

Для выражения общей таблицы: казалось (из поисков), что вышеупомянутое может произойти сбой на основепо порядку выполнения и т. д., поэтому я подумал, что CTE поможет, и попытался сделать следующее:

WITH ConvertedData_CTE (myDate)
AS
(
   SELECT CONVERT(date, myDateAsString, 103) as myDate
   FROM   myTable
)

SELECT *
FROM   ConvertedData_CTE
WHERE myDate > GETDATE()

Снова сообщение об ошибке «Конверсия не удалась при конвертации даты и/ или время из символьной строки. "(примечание: если я удаляю предложение WHERE, сообщение об ошибке отсутствует)

Еще одна попытка: поэтому я попытался использовать переменную таблицы как таковую

DECLARE @ConvertedData TABLE (myDate date)

INSERT INTO @CovertedData (myDate)
SELECT CONVERT(date, myDateAsString, 103) as myDate
FROM   myTable

SELECT *
FROM   @ConvertedDate
WHERE  myDate > GETDATE()

И, к моему удивлению, это сработало.

Итак, мой вопрос: почему работает последний запрос, а CTE и внутренний выбор не работают?Мне это кажется немного противоречивым, поскольку я ожидаю, что все они будут работать, но хотелось бы лучше понять, почему некоторые работают, а некоторые нет.

РЕДАКТИРОВАТЬ: добавление данных выборки

Пример данных

22 августа 2013 г. 10 октября 2013 г. 22 августа 2013 г. 27 августа 2013 г. 21 августа 2013 г. 23 августа 2013 г./ 2013 07.04.2010 22.08.2013 '/ /'

примечание: данные в исходной таблице имеют 3394 строки, и если я выберу первые 1010 строк, я смогу получить все запросыработать;эти данные представляют строки с 1010 по 1020, где, если я ограничу исходную таблицу, она будет работать, как описано ... однако, если я создаю новую таблицу только с этими данными ... тогда все запросы работают (этот вид имеет смысл для меня какэто то, что происходит в запросах, то есть новая таблица, переменная таблицы, работает, но другие методы не работают) надеюсь, что это указывает на какое-то хорошее направление

РЕДАКТИРОВАТЬ: дополнительная информация, изначальноне предоставлено для ясности. Все вышеперечисленные запросы имеют дополнительное предложение WHERE, поскольку некоторые данные в базе данных (которые должны быть явно сохранены как NULL) хранятся как '/ /', поэтому существует дополнительное WHERE myDateAsString <> '/ /'по всем вышеупомянутым запросам обратите внимание: я обновил пример данных, чтобы включить и этот элемент данных, как ни странно, запросы все еще работают (только одна «точка неверных данных» и предложение <> там исключают) ... вопростем не менее, почему исключение работает в SELECT, где происходит преобразование, но затем ошибки в WHERE с GETDATE (),что будет после того, как преобразование будет завершено?

1 Ответ

0 голосов
/ 20 сентября 2018

Я предполагаю, что некоторые из ваших данных текстовой даты либо повреждены, либо имеют формат, который невозможно преобразовать в дату.Чтобы очистить такие записи, вы можете попробовать использовать TRY_CONVERT:

SELECT *
FROM myTable
WHERE TRY_CONVERT(DATETIME, myDateAsString) IS NULL;

После того, как вы нашли проблемные строки, вы должны исправить свои данные, преобразовать столбец в тип даты, а затем прекратить сохранение даты.информация в виде простого текста.

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