Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка при конвертации в дату  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Некая строка конвертируется в формат даты/времени, но в таблице в какую-то из 10 000 000 строк попало неконвертируемое значение, и в результате выборки получаем следующую ошибку:
Conversion failed when converting date and/or time from character string
вид строки после конвертации вот такой:
20090926 14:53
подозреваю, что туда могло попасть, что-то типа такого
20090231 14:53
и собственно вопрос, либо, как исключить строчку с неверным значением, либо игнорировать возникающую ошибку,
или хотя-бы найти неправильную строку для удаления вручную. Визуально ее найти не реально в десятимилионной таблице...
27 окт 11, 18:26    [11511724]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Курсором построчно :-/
27 окт 11, 18:28    [11511743]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Хотя вру.

ISDATE() чекать для начала.

Сообщение было отредактировано: 27 окт 11, 18:29
27 окт 11, 18:29    [11511748]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Самое интересное что ISDATE() выдал значение 1, значит все в порядке. А откуда тогда ошибка?
27 окт 11, 18:34    [11511791]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Alexandr Gruzdev
Самое интересное что ISDATE() выдал значение 1, значит все в порядке. А откуда тогда ошибка?
Видимо, не все то дата, что ISDATE считает таковой.
27 окт 11, 18:35    [11511797]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexandr Gruzdev
Самое интересное что ISDATE() выдал значение 1, значит все в порядке. А откуда тогда ошибка?

От того, что наверное вы не выводите все 10млн записей клиенту, а сначала фильтруете их ?
27 окт 11, 18:36    [11511802]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Glory
Alexandr Gruzdev
Самое интересное что ISDATE() выдал значение 1, значит все в порядке. А откуда тогда ошибка?

От того, что наверное вы не выводите все 10млн записей клиенту, а сначала фильтруете их ?

Да фильтрую. Точно. И как быть?
27 окт 11, 18:59    [11511905]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Фильтровать пробовал и через between , и через >=
27 окт 11, 19:00    [11511911]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexandr Gruzdev
Да фильтрую. Точно. И как быть?

Не конвертировать
Или исправлять содержимое
Лучше всего конвертацией типа поля
27 окт 11, 19:10    [11511950]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Так я не знаю в каком месте и в какой строке, как искать? И что даст конвертация строки 20090231 14:58, этож 31 февраля! Во что такую строку конвертировать?
27 окт 11, 19:33    [11512056]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alexandr Gruzdev,

делаете примерно так:
declare @t table (s varchar(100))
insert @t
select '20090227 14:58' union all
select '20090230 14:58' union all
select '20090325 14:58'


select row_number() over(order by s) rn, CAST(s as datetime) from @t
Смотрите номер последней выведенно строки, потом делаете так:
select * from
(select row_number() over(order by s) rn, * from @t)t
where rn = 2 -- номер последней выведенной + 1
для надежности можно ROW_NUMBER заменить на DENSE_RANK.
27 окт 11, 19:45    [11512098]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Похоже на то,буду пробовать
27 окт 11, 20:03    [11512168]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
mccc
Member [заблокирован]

Откуда: Казань
Сообщений: 7650
Alexandr Gruzdev,
/*
структура DateTime в binary(8), выявлена подбором
--		  -1-2-3-4-5-6-7-8
--		  0123456789ABCDEF
--		  ddddddddssssssss
--	Mim	  dddddddd		=  -53690	= 0xFFFF2E46
--	Max	  dddddddd		= 2958463	= 0x002D247F
--	Mim		      ssssssss	= 0
--	Max		      ssssssss	= 25919999	= 0x018B81FF
*/
create table mTable(ID int identity(1,1), DT datetime)

insert mTable (DT) select getdate()			-- OK

-- минимальная дата
insert mTable (DT) select '1753-01-01 00:00:00.000'	-- OK
insert mTable (DT) select '1752-12-31 23:59:59.999'	-- Error
insert mTable (DT) select '1752-12-31 23:59:59.998'	-- Error
insert mTable (DT) select '1752-12-31 23:59:59.997'	-- Error

-- максимальная дата
insert mTable (DT) select '9999-12-31 23:59:59.998'	-- OK
insert mTable (DT) select '9999-12-31 23:59:59.999'	-- Error

select *, CAST(DT AS binary(8)) Bin8 from mTable order by DT

-- определить сбойную строку
select *
from (
	select ID
	    ,substring(CAST(DT AS binary(8)), 1,4) [Count_Day]
	    ,substring(CAST(DT AS binary(8)), 5,4) [Count_Mss]
	from mTable
) T where not (
		((0xFFFF2E46 <= Count_Day) and (Count_Day <= 0x002D247F))
	OR
		((0x00000000 <= Count_Mss) and (Count_Mss <= 0x018B81FF))
	  )
28 окт 11, 01:40    [11513219]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при конвертации в дату  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
mccc,

чего-то не просёк: а как же здесь контролируется корректность строкового представления даты
(а не переполнение)?
28 окт 11, 09:28    [11513618]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить