Как я могу узнать, какие данные не будут переданы? - PullRequest
2 голосов
/ 09 июня 2009

У меня есть таблица SQL с полем даты, определенным как char (8) или 20090609, и полем времени, определенным как char (4), или 1230. Я перемещаю эти данные в другую таблицу и хочу объединить два поля и поместите их в поле smalldatetime в новой таблице. Мой запрос таков:

INSERT NewTable(eventdate) 
SELECT
  CAST((datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) as smalldatetime)
FROM OldTable

Когда я запускаю это, я получаю сообщение об ошибке:

Преобразование типа данных char в Тип данных smalldatetime привел к значение smalldatetime вне диапазона.

Я пытался проверить len (datecol) и len (timecol), чтобы убедиться, что они как минимум соответствуют правильному количеству символов. Я понятия не имею, как я могу найти оскорбительные данные, какие-либо предложения? База данных SQL2000, и я использую SMO 2008.

Ответы [ 3 ]

6 голосов
/ 09 июня 2009

Попробуйте это:

SELECT datecol, timecol
FROM OldTable
WHERE ISDATE(datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 2, 2)) = 0

Это покажет вам, какие строки не могут быть успешно преобразованы.

0 голосов
/ 09 июня 2009

Вероятно, выходит за пределы допустимых значений smalldatetime С 1 января 1900 года по 6 июня 2079 года

РЕДАКТИРОВАТЬ При ближайшем рассмотрении я думаю, что параметры подстроки для второй части времени могут быть неправильными (что может быть целой проблемой), обновлены ниже для отражения подстроки (timecol, 3, 2)

Новый подход этот sql предполагает, что все даты имеют длину 8 символов, а время - 4.

Select SubString(DateCol, 1, 4) as tehYear, 
Substring(DateCol, 5,2) as tehMonth, 
SubString(DateCol, 7,2) as tehDay,
SubString(TimeCol, 1,2) as tehHour,
Substring(TimeCOl, 3,4) as tehMinute,
*
from OldTable
where
(SubString(DateCol, 1,4) > 9999 or SubString(DateCol, 1,4) < 1753)
OR (Substring(DateCol, 5,2) > 12 or Substring(DateCol, 5,2) < 1)
OR (SubString(DateCol, 7,2) > 31 or SubString(DateCol, 7,2) < 1)
OR (SubString(TimeCol, 1,2) > 23 or(SubString(TimeCol, 1,2) < 0)
OR (Substring(TimeCOl, 3,4) > 59 or Substring(TimeCOl, 3,4) <0)

Попробуйте привести к дате и посмотреть, есть ли какие-либо даты, выходящие за пределы этого диапазона, чтобы идентифицировать ваши проблемы.

    SELECT
    CAST((datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2))
    as datetime)
    FROM OldTable 
    Where CAST((datecol + ' ' + substring(timecol, 1, 2) 
    + ':' + substring(timecol, 3, 2)) as datetime) 
    > Cast('06/06/2079' as datetime) or CAST((datecol + ' ' 
    + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) as datetime)
    < Cast('01/01/1900' as datetime)
0 голосов
/ 09 июня 2009

Если вы запустите запрос в анализаторе запросов, он скажет вам, в какой строке произошла ошибка!

...