日付が "DDMMYYYY"の形式(例: "31012016")で表されているファイルからETLを開発しています。
この文字列を取得して、データが挿入されるSQLテキストに直接渡します。 SQL Serverがもう一度解析できるように、C#のDateTimeに解析して「YYYY-MM-DD」にフォーマットしたくない。
現在のように、日付文字列は.Netによって一度解析され、次に.NetによってフォーマットされてSQLコードに出力され、SQL Serverによって再度解析されます。フラットファイルから文字列を取得し、変換せずにSQLコードに直接配置します。
SQL Serverは "YYYYMMDD"を認識しますが、 "DDMMYYYY"の場合、次のメッセージで失敗します。
文字列から日付や時刻を変換するときに変換に失敗しました。
例:
_DECLARE @datevar date = PARSE('31012016' as date using 'pt-BR');
SELECT @datevar;
_
それを機能させる方法はありますか?
PARSE('31012016' as date using 'pt-BR')
を試しましたが、例外が発生しました。 _TRY_PARSE
_はnullを返します。 CASTおよびCONVERT(Transact-SQL) も試しましたが、このスタイルは存在しないようです。
日付が区切り文字なしで8桁の数値で表されている場合、SQL Serverは常にYYYYMMDD
として解釈しようとします。その形式は、ロケールまたは文化に依存しないものとして意図的に選択されており(実際には ISO 8601 標準日付形式の1つでもあります)、サーバーにそれを解釈させる方法はありません。 DDMMYYYY
または他の方法で。
したがって、DDMMYYYY
文字列の日付部分を再配置してYYYYMMDD
にします。
CONVERT(
date,
SUBSTRING(@datestring, 5, 4) + SUBSTRING(@datestring, 3, 2) + SUBSTRING(@datestring, 1, 2)
)
または、区切り文字を挿入して、既知の区切られたDMY形式のいずれかに一致させます(例:DD/MM/YYYY
:
CONVERT(
date,
STUFF(STUFF(@datestring, 5, 0, '/'), 3, 0, '/'),
103 -- DD/MM/YYYY
)
直接の変換はないことに同意しますが、これは非常に単純ですが、パフォーマンスが低下するため、少し文字列を操作してください。
DECLARE @datevar DATE
SET @datevar = TRY_PARSE(FORMAT(TRY_CAST('31012016' AS INT),'00/00/0000')
AS DATE USING 'PT-BR')
SELECT @datevar;
いいえ、暗黙的に変換する方法を見つけることができませんでした。これは私が思いつくことができる最も簡単なものです。
DECLARE @etldate varchar(max) = '31012016';
DECLARE @datevar date = CAST(SUBSTRING(@etldate, 3, 2) + '/' + SUBSTRING(@etldate, 1, 2) + '/' + SUBSTRING(@etldate, 5, 4) AS date);
SELECT @datevar;