Преобразование даты в 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)

То есть вставьте правильное значение дня в строку и выполните преобразование.

Другие вопросы по тегам