1. ホーム
  2. データベース
  3. マイサク

[解決済み] datetimeの挿入時に文字列から日付や時刻を変換すると、変換に失敗する

2021-12-28 20:04:53

SQLを実行しています。

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に変換できません。

そこで、スタックオーバーフローで提案されていた以下の形式を試してみました。

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

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

文字列から日付や時刻を変換する際に、変換に失敗しました。

解決方法は?

SQL Server がサポートする形式は多数あります。 CASTとCONVERTに関するMSDNブックスオンライン . それらのフォーマットのほとんどは 依存 そのため、これらの設定がうまくいく場合もあれば、うまくいかない場合もあります。

これを解決する方法は、(少し脚色していますが)このように ISO-8601 日付形式 SQL Server でサポートされているこの形式は、次のように動作します。 常に - SQL Server の言語や日付フォーマットの設定に関係なく、このようなことができます。

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

  • YYYYMMDD は日付だけです(時間部分はありません)ので、ここに注意してください。 ダッシュは使わないでください。 これはとても重要なことです。 YYYY-MM-DD NOT SQL Server の日付フォーマットの設定に依存しないので、このようなことはありません。 ない はすべての状況で動作します。

または

  • YYYY-MM-DDTHH:MM:SS 日付と時刻の場合 - ここに注意: このフォーマット があります。 ダッシュ(ただし できる は省略される)、そして固定の T の日付と時刻の部分をデリミタとして使用します。 DATETIME .

SQL Server 2000 以降のバージョンで有効です。

ですから、あなたの具体的なケースでは、これらの文字列を使用してください。

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

で大丈夫です(注意:インターナショナルな 24時間 の形式を使用します)。

または SQL Serverを使用している場合 2008 またはそれ以降のバージョンでは DATETIME2 データ型(単なる 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の日付形式の設定でも、問題なく使用できます。