У меня есть файл Excel, содержащий столбец с датами в формате дд/мм/гггг. Когда я пытаюсь импортировать его с помощью openrowset, он говорит, что произошло несоответствие типа данных. У меня есть таблица, в которой дата определяется как тип date
. Теперь я знаю, что формат даты по умолчанию в SQL Server — гггг-мм-дд. Как избежать этого конфликта? Есть ли способ сделать тип date
по умолчанию дд/мм/гггг? Мне нужно выполнять эту операцию импорта каждый день, и она должна быть автоматизирована, поэтому я не могу допустить, чтобы она потерпела неудачу в промежутке между ними. Я попытался использовать sp_addlanguage
, чтобы сделать его британским, поскольку тип даты по умолчанию здесь дд/мм/гггг, но это не сработало :(. Я использую SQL Server 2008 и Windows 7 , если это чем-то поможет. Пожалуйста, помогите мне! Спасибо!
Как сделать формат даты по умолчанию дд/мм/гггг в SQL Server 2008?
comment
Поможет ли вместо этого изменить формат даты в файле Excel? или этот формат игнорируется?
- person Svish   schedule 10.03.2011
comment
@Svish: это фиксированный формат, который придет откуда-то еще, и с ним нельзя испортить.
- person CodingInCircles   schedule 10.03.2011
Ответы (1)
Вы можете CONVERT
входящие данные перед их вставкой. Таким образом, в операторе openrowset, где вы выбираете поле, вы можете окружить его оператором CONVERT
. Вот пример:
print convert(date,'19/07/2010',103)
Это дата в британском стиле, но если вы запустите ее, вы увидите, что она преобразована в удобный для SQL формат.
person
Tom Morgan
schedule
10.03.2011
@Tom: У меня есть следующий SQL-запрос:
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;IMEX=1;HDR=NO;DATABASE=D:\Nemmadi Project\Dummy Bank Statement.xls', 'Select * from [Sheet1$]')
Где я должен добавить оператор CONVERT
? Кроме того, я мог успешно вставить его через bulk insert
, когда он был в формате CSV. Дата в файле имеет формат: 03.01.2011 (1 марта 2011). Я сделал: set language 'british english' bulk insert bank_report from 'D:\Nemmadi Project\Dummy Bank Statement.csv' with (firstrow=2, maxerrors=0, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
- person CodingInCircles; 10.03.2011
@Tom: Но когда я просматриваю таблицу, дата была вставлена как: 2011-03-01 00:00:00.000. Что с этим делать? При определении таблицы, когда я попытался сделать столбец даты типом
DATE
, BULLK INSERT
отказался работать, работая только тогда, когда я сделал его DATETIME
. Любые обходные пути?
- person CodingInCircles; 10.03.2011
Во-первых, вместо выбора *, если вы укажете фактические строки (вы увидите имена в заголовке строки после того, как вы сделали *). Предположим, что это: Поле1, Поле2, Поле3, и Поле2 является столбцом даты. Затем вы можете переписать оператор: SELECT Field1, CONVERT(date,Field2,103), Field3 FROM OPENROWSET... Это был бы мой предпочтительный метод, а не возиться с настройками языка... но если он работает для вас ..
- person Tom Morgan; 10.03.2011
@Tom: Спасибо за подсказку! Работает только в формате CSV. Кроме того, есть ли у вас какие-либо советы по конфликту
DATETIME
/DATE
?
- person CodingInCircles; 10.03.2011
вы должны обнаружить, что CONVERT выше создаст что-то, что может перейти либо в дату, либо в дату и время, хотя я бы это сделал. Так что странно, что нет. Теперь я немного запутался ... какое из утверждений вы используете сейчас?
- person Tom Morgan; 10.03.2011
Я понял! Это был файл xlsx, который я пытался вставить. Он отлично работает с файлами xls. Единственное, теперь мне нужно сделать файл динамическим. Каждый день я получаю новый файл, и мне нужно вставить его в таблицу. Имя файла может меняться каждый день, но содержание останется прежним. Кроме того, как я могу расширить его, чтобы прочитать правильный лист? И наконец, как я могу использовать openrowset, чтобы пропустить несколько строк, взять только несколько столбцов и прочитать все столбцы между несколькими первыми пропущенными и теми, которые будут пропущены в конце?
- person CodingInCircles; 11.03.2011
Там около 5 разных вопросов! Я бы посоветовал закрыть этот вопрос, выбрав ответ (это также поможет вашему коэффициенту ответов, который составляет всего 50%), а затем задать новые вопросы для каждой отдельной проблемы. Это сделает ваши вопросы более заметными, а значит, у вас будет больше шансов получить быстрый и точный ответ.
- person Tom Morgan; 12.03.2011