Как сделать формат даты по умолчанию дд/мм/гггг в SQL Server 2008?

У меня есть файл Excel, содержащий столбец с датами в формате дд/мм/гггг. Когда я пытаюсь импортировать его с помощью openrowset, он говорит, что произошло несоответствие типа данных. У меня есть таблица, в которой дата определяется как тип date. Теперь я знаю, что формат даты по умолчанию в SQL Server — гггг-мм-дд. Как избежать этого конфликта? Есть ли способ сделать тип date по умолчанию дд/мм/гггг? Мне нужно выполнять эту операцию импорта каждый день, и она должна быть автоматизирована, поэтому я не могу допустить, чтобы она потерпела неудачу в промежутке между ними. Я попытался использовать sp_addlanguage, чтобы сделать его британским, поскольку тип даты по умолчанию здесь дд/мм/гггг, но это не сработало :(. Я использую SQL Server 2008 и Windows 7 , если это чем-то поможет. Пожалуйста, помогите мне! Спасибо!


person CodingInCircles    schedule 10.03.2011    source источник
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
comment
@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
comment
@Tom: Но когда я просматриваю таблицу, дата была вставлена ​​​​как: 2011-03-01 00:00:00.000. Что с этим делать? При определении таблицы, когда я попытался сделать столбец даты типом DATE, BULLK INSERT отказался работать, работая только тогда, когда я сделал его DATETIME. Любые обходные пути? - person CodingInCircles; 10.03.2011
comment
Во-первых, вместо выбора *, если вы укажете фактические строки (вы увидите имена в заголовке строки после того, как вы сделали *). Предположим, что это: Поле1, Поле2, Поле3, и Поле2 является столбцом даты. Затем вы можете переписать оператор: SELECT Field1, CONVERT(date,Field2,103), Field3 FROM OPENROWSET... Это был бы мой предпочтительный метод, а не возиться с настройками языка... но если он работает для вас .. - person Tom Morgan; 10.03.2011
comment
@Tom: Спасибо за подсказку! Работает только в формате CSV. Кроме того, есть ли у вас какие-либо советы по конфликту DATETIME/DATE? - person CodingInCircles; 10.03.2011
comment
вы должны обнаружить, что CONVERT выше создаст что-то, что может перейти либо в дату, либо в дату и время, хотя я бы это сделал. Так что странно, что нет. Теперь я немного запутался ... какое из утверждений вы используете сейчас? - person Tom Morgan; 10.03.2011
comment
Я понял! Это был файл xlsx, который я пытался вставить. Он отлично работает с файлами xls. Единственное, теперь мне нужно сделать файл динамическим. Каждый день я получаю новый файл, и мне нужно вставить его в таблицу. Имя файла может меняться каждый день, но содержание останется прежним. Кроме того, как я могу расширить его, чтобы прочитать правильный лист? И наконец, как я могу использовать openrowset, чтобы пропустить несколько строк, взять только несколько столбцов и прочитать все столбцы между несколькими первыми пропущенными и теми, которые будут пропущены в конце? - person CodingInCircles; 11.03.2011
comment
Там около 5 разных вопросов! Я бы посоветовал закрыть этот вопрос, выбрав ответ (это также поможет вашему коэффициенту ответов, который составляет всего 50%), а затем задать новые вопросы для каждой отдельной проблемы. Это сделает ваши вопросы более заметными, а значит, у вас будет больше шансов получить быстрый и точный ответ. - person Tom Morgan; 12.03.2011