web-dev-qa-db-ja.com

SQL Serverに「DDMMYYYY」を解析させる

日付が "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) も試しましたが、このスタイルは存在しないようです。

5
Hikari

日付が区切り文字なしで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
)
14
Andriy M

直接の変換はないことに同意しますが、これは非常に単純ですが、パフォーマンスが低下するため、少し文字列を操作してください。

    DECLARE @datevar DATE
    SET @datevar = TRY_PARSE(FORMAT(TRY_CAST('31012016' AS INT),'00/00/0000')
                   AS DATE USING 'PT-BR')
    SELECT @datevar;
5
Mister Magoo

いいえ、暗黙的に変換する方法を見つけることができませんでした。これは私が思いつくことができる最も簡単なものです。

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; 
2
Bruce Dunwiddie