11

私は常に日時の変換にこのコードを使用します:

 DECLARE @a datetime
 SET @a= CONVERT(datetime,'2012-12-28 14:04:43') 
 print @a

しかし、これはもう機能しません!SQL Server を再起動しようとしましたが、問題は残ります。

変換エラー

画像のエラーはイタリア語です。英語では次のようになります。

char データ型を datetime に変換した結果、datetime 値が許容値の範囲外になりました。

4

3 に答える 3

17

SQL Server では多くの形式がサポートされています。CAST および CONVERT については、MSDN Books Online を参照してください。これらの形式のほとんどは、使用している設定に依存します。したがって、これらの設定が機能する場合と機能しない場合があります。

これを解決する方法は、SQL Server でサポートされている (少し変更された) ISO-8601 日付形式を使用することです。この形式は、SQL Server の言語と日付形式の設定に関係なく、常に機能します。

ISO-8601 形式は SQL Server でサポートされており、次の 2 つの形式があります。

  • YYYYMMDD日付のみ (時間部分なし)。ここに注意してください:ダッシュはありません! 、それは非常に重要です! SQL Server の dateformat 設定とは無関係ではなく、すべての状況で機能するとは限りYYYY-MM-DDませ!

また:

  • YYYY-MM-DDTHH:MM:SS日付と時刻 - ここに注意してください: この形式にはダッシュ (ただし、省略可能T) があり、DATETIME.

これは、SQL Server 2000 以降で有効です。

SQL Server 2008 以降とDATEデータ型 (のみDATE-ではなく DATETIME!) を使用する場合、実際にYYYY-MM-DD形式も使用でき、SQL Server の任意の設定でも機能します。

なぜこのトピック全体がそれほどトリッキーでややこしいのか、私に聞かないでください。ただし、このYYYYMMDD形式では、SQL Server のどのバージョンでも、SQL Server の言語と日付形式の設定でも問題ありません。

したがって、具体的なケースでは、これを使用します:

DECLARE @a datetime
SET @a= CONVERT(datetime, '2012-12-28T14:04:43') 
print @a

これは、任意の言語と日付形式の設定を使用して、任意のSQL Server インストールで機能するはずです。

元のコードを米国英語で実行すると、問題なく動作します。

SET LANGUAGE English

DECLARE @a datetime
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a

Dec 28 2012  2:04PM

ただし、言語としてイタリア語 (またはドイツ語、英国語、またはフランス語) を使用する場合、日付/時刻文字列の途中に がない形式は言語に依存せず、「安全」ではないため失敗しますT

SET LANGUAGE Italian

DECLARE @a datetime
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a

Msg 242, Level 16, State 3, Line 4
La conversione di un tipo di dati varchar in datetime ha generato un valore non compreso nell'intervallo dei valori contractiti.

于 2012-12-28T17:08:01.843 に答える
4

文字列を日時に変換しようとしています。問題は日付部分です。最善の方法は、日付文字列を取得してISO format (yyyymmdd)から変換することです。これを試して;

DECLARE @a datetime
SET @a= CONVERT(datetime,replace('2012-12-28 14:04:43', '-','')) 
print @a
于 2012-12-28T17:06:43.463 に答える
0

私の推測では、コンピューターでデフォルトの日時形式が変更されました。変換仕様を再度追加します。

SET @a= CONVERT(datetime,'2012-12-28 14:04:43', 121) 
于 2012-12-28T17:07:28.660 に答える