188

次のようにテーブルを作成しようとしていましたが、

create table table1(date1 datetime,date2 datetime);

まず、以下のように値を挿入してみました。

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

それは言ってエラーを与えました、

varchar を datetime に変換できません

次に、stackoverflow によって提案された投稿の 1 つとして、以下の形式を試しました。

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

しかし、まだエラーが発生しています。

文字列から日時を変換する際に変換に失敗しました

助言がありますか?

4

17 に答える 17

192

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 以降で有効です。

したがって、特定のケースでは、次の文字列を使用します。

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

大丈夫です (注: これには、12 時間制の AM/PM 形式ではなく、国際的な24 時間形式を使用する必要があります)。

の方法: SQL Server 2008以降を使用している場合は、DATETIME2(plain の代わりに) datatypeを使用することもできDATETIMEます。現在のINSERTものは問題なく動作します! :-)DATETIME2ははるかに優れており、変換の際にうるさいことはほとんどありません。とにかく、SQL Server 2008 以降の推奨される日付/時刻データ型です。

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

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

于 2013-01-02T08:51:40.790 に答える
36

SQL サーバーでの変換は、使用されている日付または時刻の形式が原因ではなく、システムに受け入れられない間違ったデータを保存しようとしているために失敗することがあります。

例:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

SQL サーバーは次のエラーをスローします。

Conversion failed when converting date and/or time from character string.

このエラーの理由は単純に、年 (2015) にそのような日付 (Feb-29) がないためです。

于 2015-06-06T20:18:34.097 に答える
19

簡単な答え - 5 はイタリア語の「yy」、105 はイタリア語の「yyyy」です。したがって:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

正常に動作しますが、

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

エラーになります。

同じく、

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

エラーが発生します。

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

動作します。

于 2013-01-02T09:01:07.613 に答える
10

可能な限り、カルチャ固有の日付/時刻リテラルを避ける必要があります

日付/時刻をリテラルとして提供するための安全な形式がいくつかあります。

のすべての例2016-09-15 17:30:00

ODBC(直ぐに型として扱われるのでお気に入り)

  • {ts'2016-09-15 17:30:00'}--タイムスタンプ
  • {d'2016-09-15'} --日付のみ
  • {t'17:30:00'} --時間のみ

ISO8601(どこでもベスト)

  • '2016-09-15T17:30:00'――途中注意T

区切られていない (数値として誤解されるリスクが小さい)

  • '20160915' --純粋な日付のみ

注意: 無効な日付は奇妙なエラーで表示される傾向があります

  • 6月31日も2月30日もない…

奇妙な変換エラーのもう 1 つの理由: 実行順序!

SQL-Server は、予期しない実行順序で処理を実行することをよく知っています。記述されたステートメントは、型に関連するアクションが発生する前に変換が行われたように見えますが、エンジンは後のステップで変換を行うことを決定します。

Rusano.com : "t-sql-functions-do-no-imply-a-certain-order-of-execution"とここに関連する質問があります。

于 2016-09-15T06:38:24.480 に答える
4

最良の方法はこのコードです

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
于 2016-01-29T17:44:09.580 に答える
2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,
于 2016-01-11T19:40:07.723 に答える
2

SQLサーバーで実際に実行される日時形式は

yyyy-mm-dd hh:MM:ss
于 2016-03-18T11:49:04.870 に答える