powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Conversion failed when converting date and/or time from character string. При update.
8 сообщений из 8, страница 1 из 1
Conversion failed when converting date and/or time from character string. При update.
    #39567702
СферическийКуб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Надо проапдейтить одну таблицу Table1 по условиям из другой таблицы-справочника ParamsTable.
В ParamsTable свалка из всяких разных значений разных типов(по логике разных) хранящихся в одном varchar поле param_value

Идентификация типа параметров в справочнике идет по полю PType.
В поле param_value нужного мне типа содержится дата в виде '31/12/2017' остальные значения ненужных мне типов содержат все что угодно, т.е. convert(datetime, param_value, 103) выдаст ошибку.

В итоге такой апдейт
Код: sql
1.
2.
3.
4.
5.
6.
	update t
		set flag = 1	
	
	from	Table1  t    
        inner join  ParamsTable p on  p.tid=t.tid  and p.PType in (1,2,3) 
	where convert(datetime, p.param_value, 103) > @max_date	


выдаст ошибку Conversion failed when converting date and/or time from character string.

Вопрос: почему, и как этого избежать?
В таблице ParamsTable значение поля param_value при условии PType in (1,2,3) заведомо рабочие, и если вывести все значения
нужных типов с преобразованием select convert(datetime, p.param_value, 103) from ParamsTable p where p.tid=t.tid and p.PType in (1,2,3)
то ошибок не будет.

По идее условие в where должно отрабатывать уже после join и мусорных записей другого типа туда не должно попасть.
...
Рейтинг: 0 / 0
Conversion failed when converting date and/or time from character string. При update.
    #39567705
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СферическийКуб,

авторПо идее условие в where должно отрабатывать уже после join и мусорных записей другого типа туда не должно попасть.

по чьей идее?
TRY_CONVERT/TRY_CAST
...
Рейтинг: 0 / 0
Conversion failed when converting date and/or time from character string. При update.
    #39567709
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СферическийКубПо идее условие в where должно отрабатывать уже после join и мусорных записей другого типа туда не должно попасть.Совершенно не обязательно. Смотрите план выполнения - там видно в какой момент вычисляется ваш convert.

Исправление "в лоб"
Код: sql
1.
2.
3.
4.
5.
6.
	update t
		set flag = 1	
	
	from	Table1  t    
        inner join  ParamsTable p on  p.tid=t.tid 
	where case when p.PType in (1,2,3) then convert(datetime, p.param_value, 103) end > @max_date
...
Рейтинг: 0 / 0
Conversion failed when converting date and/or time from character string. При update.
    #39567710
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это по вашей идее так,
сервер же решил сперва конвертировать.
---
сделайте выборку с нужным условием и без попытки конвертации во временную таблицу.
уже из нее берите и конвертируйте
...
Рейтинг: 0 / 0
Conversion failed when converting date and/or time from character string. При update.
    #39567715
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СферическийКубПо идее условие в where должно отрабатывать уже после join и мусорных записей другого типа туда не должно попастьЭто по вашей идее. А сервер делает вычисления в том порядке, который ему нравится.
Обычный выход из такой ситуации - проверять конвертируемость в CASE.
Другая возможность - если версия сервера SQL2012, то использовать TRY_CONVERT()
Код: sql
1.
2.
3.
4.
5.
WHERE
 CASE
  WHEN p.param_value LIKE '%[0123][0123456789]/[01][012]/[12][0123456789][0123456789][0123456789]%'
  THEN CONVERT(DATETIME,p.param_value,103)
 END>@max_date

Конечно, некоторые "неправильные" даты удовлетворят этому условию...
Но можно усложнять и дорабатывать, а основную массу "правильных" дат отфильтрует без ошибок.

В общем, вы сами себе устроили этот праздник.
Ведь можно же было хранить в строке дату в виде 'YYYYMMDD hh:mm:ss.nnn' или 'YYYY-MM-DDThh:mm:ss.nnn'
...
Рейтинг: 0 / 0
Conversion failed when converting date and/or time from character string. При update.
    #39567718
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapВедь можно же было хранить в строке дату в виде 'YYYYMMDD hh:mm:ss.nnn' или 'YYYY-MM-DDThh:mm:ss.nnn'Хотя, нет. Вам бы это не помогло.
В поле-то хранятся не только даты...
...
Рейтинг: 0 / 0
Conversion failed when converting date and/or time from character string. При update.
    #39567721
СферическийКуб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо.
Архитектура базы не моя, я только костыли подставляю.
Сервер 2008R2.
...
Рейтинг: 0 / 0
Conversion failed when converting date and/or time from character string. При update.
    #39567750
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СферическийКуб,

tryconvert(), если позволяет версия.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Conversion failed when converting date and/or time from character string. При update.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]