У меня возникла очень странная проблема с 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 (),что будет после того, как преобразование будет завершено?