У меня есть таблица, в записи которой есть дата, но эта дата сохраняется как VARCHAR
, мне сказали, что я могу преобразовать ее DATE
в SELECT
. Вот что у меня есть:
SELECT * FROM tabla WHERE CONVERT (date(15), fecha, 103) = '1/01/2017';
Но это дает мне следующую ошибку:
Сообщение 291, уровень 16, состояние 1, строка 13 CAST или CONVERT: для типа «дата» указаны недопустимые атрибуты.
записи таблицы с этим форматом вVARCHAR
16/06/2016
20/06/2016
20/06/2016
16/07/2016
Представьте такие данные:
В конце концов я специально поставил неверное значение:
40/01/2017
.Моя тестовая колонка называется
fecha_var
.Этот запрос:
Он будет получать данные, но выдаст следующую ошибку:
И написано так:
Он выберет только первые три строки и выдаст ту же ошибку, что и раньше.
Решения
Большой проблемой при назначении несовпадающих типов данных (как в данном случае при использовании a
VARCHAR
вместо aDATETIME
) являются ошибки, возникающие при вводе данных.Это означает, что в столбце могут быть недопустимые даты. Тогда вы должны рассмотреть эту возможность.
Рассмотрим два возможных решения.
Решение 1. SQL-SERVER 2012+
В SQL-Server 2012 и более поздних версиях есть функция
TRY_CONVERT
, которая:Запрос с
TRY_CONVERT
будет:Решение 2: SQL-сервер 2012-
Вы можете решить это с помощью этого запроса:
Результат:
Как видите, запрос возвращает дату эпохи (
01.01.1900
), когда значения неверны.Лечите проблему в корне
Хотя вы говорите, что у вас нет доступа для изменения базы данных. Если бы вы это сделали, проблема была бы решена путем создания нового столбца в таблице, называемого, например
FECHADATE
, и выполненияUPDATE
:SQL Server 2012+
SQL-сервер 2012-
Результат:
Затем вам нужно будет выполнить проверку, проверив даты с помощью Epoch (01-01-1900), указав, что значение в старом столбце
VARCHAR
не является допустимой датой. Вам придется каким-то образом исправить, выяснив, какая правильная дата должна стоять в этой колонке.[broma]Esperemos que no hayan despedido al que digitó esos datos y se acuerde cual era la fecha correcta y que explique por qué estaba dormido ese día y cuántos errores como ese habrá cometido.[/broma]
Как уже объяснялось в ответе @Marcos Pérez, правильный синтаксис для преобразования:
Но это же преобразование вы должны применить к дате, с которой вы сравниваете:
...или, чтобы немного упростить, вы можете использовать формат
YYYYMMDD
, который не требует явного преобразования:Если, несмотря на эти изменения, вы по-прежнему получаете ошибки, это означает, что не все ваши данные соответствуют формату
DD/MM/YYYY
, который вы указали в своем вопросе. Это риски использования неправильного типа для сохранения данных. Вы должны будете получить записи, которые имеют неправильный формат, и исправить их.Вам просто нужно использовать тип переменной datetime вместо date(15), чтобы это преобразование работало хорошо для вас Я прилагаю ссылку на исходный пост на случай, если вы захотите взглянуть, а также окончательный запрос. оригинальный пост