2012-01-20 4 views
1

私は、様々なフォーマットの生年月日を持つ文字列フィールドdobを持っています。SQLで日付を標準化しています。算術オーバーフロー

DOB

1945年7月1日
1967年1月7日
1956年5月13日

1947年5月8日
1953年9月27日
1952年3月25日

私が持っていますMS SQL 2005を使用して標準化された日付フィールドを作成しようとしました

select convert(datetime,dob,103) 
from myTable 

最後の値に関連付けられていると思われる算術オーバーフローが発生します。これは、おそらく25日を1日に変換しようとしているからです。 私は を英国と様々な他のスタイル成功なし

お勧めはありますか?

答えて

1

なぜ特定の形式で保存しようとしますか?あなたはdatetime型として格納するだけでいいですか?ロケールに依存しないで格納することの最大の利点は、プレゼンテーションロジックを、それが所属するUIにオフロードできることです。さらに、3-4-5のDOB(2005年4月5日、2005年3月4日、2005年4月3日)を持っている不都合な状況を避けることができます。

datetimeへの変換は私にとってはうまく機能します(USロケール)。

; with myTable (dob)as 
(
    select 'July 1, 1945' 
    UNION ALL SELECT '1967-1-7' 
    UNION ALL SELECT '13 May 1956' 
    UNION ALL SELECT '8 may 1947' 
    UNION ALL SELECT '27 september 1953' 
    UNION ALL SELECT '1952-3-25' 
) 
SELECT 
    cast(T.dob AS datetime) AS real_datetime 
, T.dob 
FROM 
    myTable T 

結果

real_datetime dob 
1945-07-01 00:00:00.000 July 1, 1945 
1967-01-07 00:00:00.000 1967-1-7 
1956-05-13 00:00:00.000 13 May 1956 
1947-05-08 00:00:00.000 8 may 1947 
1953-09-27 00:00:00.000 27 september 1953 
1952-03-25 00:00:00.000 1952-3-25 
+0

感謝。私は問題が103スタイルであったと思う。しかし、フルテーブルに適用すると、同じエラーが発生します。一年だけ、nullsと空白は問題を引き起こしていないようです。エラーを引き起こしている行をSQL​​が修正して除外できるようにSQLが指定できるのですか? – pssguy

+0

簡単には保証されていない解決策は、WHERE ISDATEのようなwhere節を追加することですT.dob)> 0' Aaron Bertrandは、私の同様の[質問](http://dba.stackexchange.com/questions/5312/conversion-of-varchar-data-to-datetime-failing)で良い説明+ – billinkc

+0

私はちょうど同じソリューションに到着した! – pssguy

関連する問題