web-dev-qa-db-ja.com

varcharの日付を日付に変換する(dd / mm / yy)

次のような日付が記述されたCSVファイルがあります。250909,240909で、SQL Serverデータベースにvarcharsとして保存されます。

25/09/09の形式でdd/mm/yyyyのように表示されるように、日付に変換するにはどうすればよいですか。

現時点では変換できますが、次のように変換されます:2025/09/09、つまり、間違ったyyyy/mm/dd形式を使用しているため、最初の列が日、2番目が月であることがわかりますそして3年目。

3

文字列をDATE値にに正常に変換する方法についての問題を理解しています。整数で区切られていない文字列は、年月日の順序であると見なされます。 (もちろん、日付はデータベースのDATEデータ型に格納する必要があるというコメントにも同意します。)

MSDN CONVERTのドキュメントを確認しても、文字列の組み込み変換は示されていませんが、簡単に回避できます。

http://msdn.Microsoft.com/en-us/library/ms187928.aspx -CASTおよびCONVERT

確認しやすいように月を8に変更しました。 CONVERTスタイルオプション3を使用すると、次のことができます。

DECLARE @String VARCHAR(10);
DECLARE @DateValue DATE;
SET @String = '250809'; 

-- Convert your undelimited string DDMMYY into a DATE
-- First: Add / between the string parts.
SET @STRING = SUBSTRING(@String,1,2)+'/'+
     SUBSTRING(@String,3,2)+'/'+SUBSTRING(@String,5,2);
-- Second: Convert using STYLE 3 to get DD/MM/YY interpretation
SELECT @DateValue = CONVERT(Date, @String, 3);

-- Using the DATE 
-- Select the value in default Year-Month-Day
SELECT @DateValue AS DefaultFormat;    
-- Select the value formatted as dd/mm/yy
SELECT CONVERT(VARCHAR(20),@DateValue,3) AS [DD/MM/YY];

最後の2つの選択の結果は次のとおりです。

DefaultFormat
-------------
2009-08-25

DD/MM/YY
--------
25/08/09

DATEを希望どおりにフォーマットするには、「/」区切り文字を挿入し、STYLE 3を使用して文字列からDATEに変換する必要があります。 (同様に機能する他の回避策と変換スタイルがあると確信しています。)

同様に、日付を希望どおりに表示する場合は、スタイル3を使用する必要があります

5
RLF

別のアプローチは、SQL Server 2008以降で日付に直接キャストし、それをそのように格納することです @ ypercubeが上記でコメントしたように2000 <= all expected years <= 2099を想定:

DECLARE @d CHAR(6) = '250909';
SELECT DATEFROMPARTS('20'+RIGHT(@d,2),SUBSTRING(@d,3,2),LEFT(@d,2));

250999などを使用できる場合は、少し異なる方法で処理を行う必要がある場合があります。たとえば、それが1999年か2099年かを示す方法が必要です。これも検証を処理しません(他の回答と同様に、252525のような値で窒息します)。

日付を表示する場合は、表示/プレゼンテーションレイヤーでフォーマットしますが、データベースに正しく保存します。 25/09/2009のようなあいまいな形式で表示することが実際に役立つかどうかはまだ疑問です-その日付は具体的には明らかに9月25日ですが、オーディエンス全体が常に07/08/2009を正しく受け取ることを本当に確信していますか? 7月8日のアメリカ滞在中ですが、先週はカナダにいたので、8月7日になると思います。 2009-07-08のような出力形式は、はるかに明確で、誤解されにくくなっています。さらに良いのはJuly 8th, 2009でしょう-しかし、それは別の言語を使用する人々への扉を開きます。そうは言っても、これらのフォーマットはクライアントアプリケーションによって完全に制御でき(C#には非常に強力なフォーマット機能があります)、実際にデータベースにデータを格納する方法を指示するべきではありません。自動検証、すべての日付/時刻機能などを取得するため、日付として保存する必要があります。日付を文字列として保存するのをやめます(さらに、YYYYMMDDなどの信頼性の高いリテラル形式をCSVに含めようとする場合もあります)。おそらくいくつかの有用な読み物:

3
Aaron Bertrand