Преобразование данных в SQL Server - PullRequest
1 голос
/ 13 апреля 2010

Я загружаю кучу данных, которые содержат даты, отформатированные как показано ниже:

00-JAN-0000
00-FEB-0000
00-MAR-0000
00-APR-0000
00-MAY-0000
00-JUN-0000
00-JUL-0000
00-AUG-0000
00-SEP-0000
00-OCT-0000
00-NOV-0000
оо-декабря-0000

SQL не может автоматически конвертировать эти даты, потому что он не распознает месячную часть даты. У меня есть около 50 000 записей для импорта. Есть идеи?

ОП сказал в комментарии:

Данные, с которыми я работаю дата рождения клиента. Так как я сделал не хочу размещать чей-то DOB онлайн, Я замаскировал день и год с нулями но я оставил месяц как есть что вызывает проблему.

Ответы [ 4 ]

0 голосов
/ 13 апреля 2010

Кажется, я обнаружил проблему. Просматривая отправленные данные, я вижу, где в некоторых записях предыдущее поле было пустым. Тогда, когда я разделил дату, я получаю только две последние цифры года. Это то, что бросает мою ошибку. Спасибо всем за помощь.

0 голосов
/ 13 апреля 2010

создайте промежуточную таблицу, в которой есть столбец YourDateString для заполнения данными, а затем столбец фактической даты и времени YourDate, который вы обновите на другом шаге. как это:

DECLARE @YourTable table(YourDateString varchar(11), YourDate datetime)

--simulate bulk load
INSERT INTO @YourTable VALUES ('01-JAN-1976',null)
INSERT INTO @YourTable VALUES ('02-FEB-1980',null)
INSERT INTO @YourTable VALUES ('05-MAR-1991',null)
INSERT INTO @YourTable VALUES ('12-APR-1997',null)
INSERT INTO @YourTable VALUES ('22-MAY-1990',null)
INSERT INTO @YourTable VALUES ('18-JUN-1971',null)
INSERT INTO @YourTable VALUES ('17-JUL-1988',null)
INSERT INTO @YourTable VALUES ('19-AUG-1993',null)
INSERT INTO @YourTable VALUES ('19-SEP-1970',null)
INSERT INTO @YourTable VALUES ('04-OCT-1982',null)
INSERT INTO @YourTable VALUES ('08-NOV-1970',null)
INSERT INTO @YourTable VALUES ('18-DEC-1983',null)

--convert to proper datetime
UPDATE @YourTable
    SET YourDate= CONVERT(datetime,YourDateString)

--show data
select * from @YourTable

ВЫВОД:

YourDateString YourDate
-------------- -----------------------
01-JAN-1976    1976-01-01 00:00:00.000
02-FEB-1980    1980-02-02 00:00:00.000
05-MAR-1991    1991-03-05 00:00:00.000
12-APR-1997    1997-04-12 00:00:00.000
22-MAY-1990    1990-05-22 00:00:00.000
18-JUN-1971    1971-06-18 00:00:00.000
17-JUL-1988    1988-07-17 00:00:00.000
19-AUG-1993    1993-08-19 00:00:00.000
19-SEP-1970    1970-09-19 00:00:00.000
04-OCT-1982    1982-10-04 00:00:00.000
08-NOV-1970    1970-11-08 00:00:00.000
18-DEC-1983    1983-12-18 00:00:00.000

(12 row(s) affected)
0 голосов
/ 13 апреля 2010

Как вы импортируете?

Вы уверены, что одна из дат не слишком сомнительна? Ваш (действительный ненулевой) формат даты dd-mmm-yyyy должен быть принят сервером SQL;

select convert(datetime, '12-NOV-1975')
1975-11-12 00:00:00.000
0 голосов
/ 13 апреля 2010

SQL может распознать месячную часть даты, но не может распознать ваш день (ноль) или год (также ноль). Если вам нужно использовать BULK INSERT, попробуйте это:

  • Загрузить данные во временную таблицу с установленным столбцом как char (11)
  • Скопируйте (INSERT ... SELECT ...) данные в целевую таблицу

Код конверсии будет выглядеть примерно так:

INSERT MyTable (MyDate)
 select '01' + substring(@foo, 4, 3) + cast(year(getdate()) as char(4))
 from MyInterimTable

(Это установит первый день текущего года.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...