4

というvarchar(200)列がSubmit_Dateあり、MM/DD/YYYY 形式に変換しようとしています。これを行うと、次のエラーが表示されます。

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

テーブルのサンプル データは次のとおりです。

Submit_Date
-----------------------
27-09-2013 16:15:00 CST
30-09-2013 16:30:24 CST
27-09-2013 10:03:46 CST

私は次のことを試しました:

Select Convert(datetime,Submit_date,101) from dbo.Tickets
4

2 に答える 2

12

ここで日付/時刻に関して約 15 の重大な罪を犯しました。まず、簡単な答え:

DECLARE @x VARCHAR(200);

SELECT @x = '27-09-2013 16:15:00 CST'

SELECT CONVERT(CHAR(10),CONVERT(DATETIME,LEFT(@x,10),105),101);

次:

  1. いったいなぜ、日付/時刻データをvarchar(200)列に格納しているのですか? '09-27-2013'誰でもorのような値をそこに挿入できることを知っています'465-32-207floob'よね? タイム ゾーン情報が必要な場合は、DATETIMEOFFSETデータ型を調べることができます (ただし、DST に対応していないことに注意してください)。

  2. のような地域形式を保存するのはなぜdd-mm-yyyyですか? 最初の値が7 月 11 日なのか 11 月 7 日なのかを推測する必要があります。正しい07-11-2013日付/時刻データ型を使用しないのであれば、人々に推測させるような文字列形式を使用する必要はありません。などの明確な形式を使用する方がはるかに優れています。yyyy-mm-ddThh:mm:ssZ

  3. 同様に、なぜ異なる地域形式を出力するのmm/dd/yyyyですか? あなたがアウトプットした場合'05/06/2013'、聴衆の誰もがあなたが 6 月 5 日ではなく 5 月 6 日を意味していたことを理解できると 100% 確信できますか? 出力も明確にする必要があります。どうしても特定の地域やあいまいな形式で書式設定する必要がある場合は、クライアントの文字列書式設定機能を使用してください。たとえば、C# には.ToString()とがあり、.Format()これは、T-SQL がこれまでにない文字列形式で日付を表示する際に、はるかに強力で効率的です。

于 2013-10-24T03:49:32.420 に答える