Преобразование даты в SQL для значения 8 символов со значениями 00 в днях
У меня возникли проблемы при попытке выяснить, как правильно конвертировать данные. В его нынешнем виде это varchar и данные таковы:
19260200, 19770900, 20030400, 20120300, 20020500,
Итак, как вы можете видеть, у меня есть год и месяцы, но у меня нет значений для дат. Когда я пытаюсь вставить его в поле SQL в формате datetime, я получаю ошибки. Кто-нибудь знает, как я могу это исправить? Я работаю с БД из 700 000 записей, поэтому мне нужно иметь возможность писать некоторый код для ее решения, а не просто вручную просматривать и изменять.
Заранее спасибо за помощь!!!
2 ответа
INSERT dbo.destination(date_column)
SELECT dt FROM
(
SELECT dt = CASE
WHEN src_date_column LIKE '%00' THEN
STUFF(src_date_column, 8, 1, '1')
ELSE src_date_column
END
FROM dbo.source
) AS x
WHERE ISDATE(dt) = 1;
Чтобы ответить на комментарии:
AS x
это просто псевдоним. Производная таблица должна называться как-то. Если вы просто скажете:
SELECT x FROM (SELECT x = 1);
Вы получаете эту бесполезную ошибку:
Msg 102, уровень 15, состояние 1
Неверный синтаксис рядом с ';'.
Но нет, если вы скажете:
SELECT x FROM (SELECT x = 1) AS y;
Что касается вашего другого вопроса, вы можете просто добавить другие столбцы во внутренний SELECT
Например:
INSERT dbo.Citation(PatentNo, Citation, CitedBy, CitationDate)
SELECT PatentNo, Citation, WhoCitedThis, dt
FROM
(
SELECT PatentNo, CitationSource, WhoCitedThis, dt = CASE
WHEN CitationDate LIKE '%00' THEN STUFF(CitationDate, 8, 1, '1')
ELSE CitationDate
END
FROM dbo.CitationSource
) AS x
WHERE ISDATE(dt) = 1;
Теперь вам нужно решить, что вы хотите делать с недействительными датами, такими как 20120231 или 20120399. Они просто остались позади. Моей первой рекомендацией было бы сделать этот столбец с соответствующей датой или датой и временем и не допускать попадания плохих дат в систему.
Вы можете попробовать что-то вроде этого:
cast(left(val, 6)+'01') as date)
То есть вставьте правильное значение дня в строку и выполните преобразование.