2

日付を表す SQL の値がありますが、nvarchar 型です。日付の値は次の形式です。

dd/mm/yyyy hh:mm

ビューを介して、CCure 800 データベースのDATETIME形式でこの列を提示する必要があります。CAST/を使用することを期待していましたCONVERT。ただし、これを使用すると、次のエラーが返されます。

メッセージ 242、レベル 16、状態 3、行 1
varchar データ型から datetime データ型への変換により、範囲外の値が発生しました。

4

1 に答える 1

14

日付を文字列、特にUnicode 文字列として保存するのはやめてください。カレンダーの将来のバージョンで、数字の代わりにウムラウト、ポンド記号、象形文字、北京語が使用されることを懸念していますか?

日付を日付として格納します。それが、これらのデータ型の目的です。無効な解釈について心配する必要がないことに加えて、 や などのすべての利点も得られます。列に意味のDATEPARTないDATEADDものを誰かが詰め込むことを心配する必要もありません (31/02/2012から'I don''t want to enter a real date'...

それまでの間、スタイル番号を使用する必要がありますCONVERT(これは では確実に機能しませんCAST):

SELECT CONVERT(DATETIME, '13/06/2013 09:32', 103);

で動作させるには、それに応じてまたは設定を設定CASTできますが、ビュー内でこれを行うことはできず、とにかくコードが非常に脆弱になります。LANGUAGEDATEFORMAT

SET DATEFORMAT DMY;
SELECT CAST('13/06/2013 09:32' AS DATETIME);

または

SET LANGUAGE BRITISH;
SELECT CAST('13/06/2013 09:32' AS DATETIME);

非常に広いマージンで、追加のコントロールが提供することを好み、一貫性のために、このコントロールが必要ない場合でも、 toCONVERTのすべてのインスタンスをほぼ一方的に変更します(場合によっては使用する理由、必要な場合、単にできる場合)常に使用しますか?)。CASTCONVERTCASTCONVERTCONVERT

編集

不適切なデータ型の選択が原因でテーブルに忍び込んだガベージ データを特定するには、次のようにします (その後、データを修正するか、データ型を修正して、これが再び発生しないようにすることをお勧めします)。

SET DATEFORMAT DMY;
SELECT date_column FROM dbo.table_name WHERE ISDATE(date_column) = 0;
于 2013-03-07T16:01:39.113 に答える