2013-07-05 2 views
0

Я пытаюсь прочитать столбец из tbl1 с типом varchar (255) и загрузить его в tbl2 как тип datetime. См. Код ниже.SQL server 2012: перевести столбец varchar (255) в datetime в ошибку значения вне диапазона

SELECT CAST(LTRIM(RTRIM(NLCompany)) AS varchar(20)) AS SRC_NLCompany, 
CAST(LTRIM(RTRIM(AccountCode)) AS varchar(8)) AS SRC_AccountCode, 
CAST(LTRIM(RTRIM(DocumentNumber)) AS numeric(10, 0)) AS SRC_DocumentNumber, 
CAST(LTRIM(RTRIM(PaymentType)) AS varchar(1)) AS SRC_PaymentType, 
CAST(LTRIM(RTRIM(PostingDaybkDate)) AS datetime) AS SRC_PostingDaybkDate 
FROM TBL1 

Ошибка: преобразование типа VARCHAR данных в тип данных даты и времени привело к значению вне-диапазона.

ответ

2

Существует много строковых форматов, поддерживаемых SQL Server - см. MSDN Books Online on CAST and CONVERT. Большинство из этих форматов зависят от, какие у вас настройки языка/даты, поэтому эти настройки могут работать несколько раз, а иногда и нет.

Путь решения этой проблемы заключается в использовании (слегка адаптированный) ISO-8601 формат даты, который поддерживается SQL Server - это формат работы всегда - независимо от ваших языковых настроек и DateFormat SQL Server.

ISO-8601 format поддерживается SQL Server поставляется в двух вариантах:

  • YYYYMMDD для всего датирует (без временной части); примечание здесь: нет тире!, это очень важно! YYYY-MM-DD is NOT независимо от настроек даты и времени на вашем SQL Server и будет NOT работать во всех ситуациях!

или:

  • YYYY-MM-DDTHH:MM:SS для даты и времени - здесь отметить: этот формат имеет дефис (но они могут быть опущены), и фиксированный T в качестве разделителя между датой и временем часть вашего DATETIME.

Это действительное для SQL Server 2000 и новее.

Если вы используете SQL Server 2008 или более поздней версии и DATE тип данных (только DATE - неDATETIME), то вы действительно можете также использовать формат YYYY-MM-DD и что будет работать тоже с любыми настройками в вашем SQL Server ,

Не спрашивайте меня, почему эта целая тема настолько сложна и несколько запутанна - так оно и есть. Но с форматом YYYYMMDD вы должны быть в порядке для любой версии SQL Server и для любого языка и параметра dateformat на вашем SQL Server.

рекомендация для SQL Server 2008 и новее заключается в использовании DATE, если вам нужна только часть даты, и DATETIME2(n), когда вам нужно как дата и время. Вы должны попытаться начать поэтапный отказ от типа данных DATETIME, если это возможно.

Смежные вопросы