В моей компании есть таблица, в которой строка dd/mm
хранится для различных объектов, поэтому я могу сравнить ее с некоторыми другими датами (в частности, для 2006 года, например, взяв «01/04» и попытавшись сделать это 04.01.2006). * чтобы затем попытаться преобразовать это в дату и время)
Я сделал следующее:
convert(datetime, field + '/2006', 103)
так что он берет столбец dd/mm
и создает строку dd/mm/yyyy
, чтобы затем преобразовать ее в значение datetime
, которое я затем могу использовать в различных сравнениях.
Однако одна из записей в исходной таблице из 5321 потенциальной строки выдает ошибку.
Ошибка преобразования при преобразовании даты и/или времени из строки символов.
Я пробовал искать очевидные (високосные годы) и дни больше 31-го и т. д., но безуспешно.
Есть ли способ заставить SQL Server возвращать строку, которую он пытался преобразовать в дату, но затем не удалось? Что-то вроде
select id, convert(datetime, field + '/2006', 103)
on error return 'error'
чтобы я получил основной идентификатор строки, вызывающей ошибку, и мог использовать его для ее отслеживания?
select * from yourtable where try_convert(datetime,field+ '/2006',103) is null and field is not null
Что вам действительно следует сделать после того, как вы обнаружите неверные данные, так это исправить эти данные, а затем исправить дизайн; столбец varchar
не подходит для хранения дат. Используйте тип данных date
.
@ThomA, мы не контролируем структуру базы данных и таблиц с помощью стороннего программного обеспечения. В рассматриваемом поле хранятся только даты ежегодного продления (дд/мм), поскольку они каждый год одни и те же. Мне нужно было сравнить другую дату (хранящуюся в соответствующем поле даты и времени) с датой продления 2006 года, поэтому я использовал поля dateTime. Хотя конструкцию исправить невозможно, я сообщу о неточностях в данных соответствующему отделу для исправления.
Вы можете использовать TRY_CONVERT
для поиска строк с недопустимыми датами, например:
SELECT *
FROM MyTable
WHERE TRY_CONVERT(DATE, field + '/2006') IS NULL
AND field IS NOT NULL;
Всегда полезно добавить AND field IS NOT NULL
, чтобы избежать ложных срабатываний.
Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, то есть логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;).