日時の挿入中に文字列から日付や時刻を変換するときに変換に失敗しました


164

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

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

次に、私たちのスタックオーバーフローによって提案された投稿の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));

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

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

助言がありますか?


2
@Damien_The_Unbelieverあなたが言ったように、私はこの質問をする前に、この投稿stackoverflow.com/questions/12957635/…をすでに参照しました。「table1(approvaldate)の値を挿入するように依頼されました(convert(datetime、'18 -06-12 10:34:09 PM '、5));」それは仕事doesntの
マリ

回答:


163

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

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

ISO-8601形式は、 SQL Serverでサポートされている2種類があります:

  • YYYYMMDD日付のみ(時間部分なし)。ここに注意:ダッシュなし!、それは非常に重要です!ありません、あなたのSQL ServerのDATEFORMATの設定とは独立となり、NOTすべての状況で働きます!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の代わりにDATETIME)データ型を使用することもでき、現在のINSERT問題は問題なく機能します。:-) DATETIME2変換の方がはるかに優れていて、うるさくありません。SQLServer 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の言語と日付形式の設定に問題はありません。


1
注として、DATETIME2としてのキャストは、「YYYY-MM-DDTHH:MM:SSZ」でも機能します(「Z」-UTCタイムスタンプを示す末尾のZulu時間)。日時フィールドに「2013-12-16T17:21:26Z」を挿入しようとすると、このエラーが発生します。明確にするために、ISO 8601は部分的にサポートされています。ドキュメントで言及されているにもかかわらず、Zulu時間はサポートされていません。それはおそらく私が理解する時間がなかったいくつかの設定ですが、誰かが同じ問題を抱えている場合に備えて、それを覚えておいてください。
のMichał

3
'YYYYMMDD'日付形式が正常に機能することを確認できます。WHERE句でリテラル日付を指定する方法として、SQL Server 2014で試してみました。@marc_sへの多くの戦車
Giorgio Barchiesi

1
DATETIME2のものがうまくいきました。私の場合、データベーススクリプトをSQLServerから英語のスペイン語バージョンにインポートしていたため、毎回同じエラーが発生しました。私は、スクリプトで「as DATETIME」のすべての発生を「as DATETIME2」に置き換えて問題を解決しました。
アレハンドロデルリオ

24

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年)にそのような日付(2月29日)がないことです。


2
「このエラーの理由は、単にそのような日付(2月29日)が年(2015)にないことです」 これがまさに私がこのエラーを受け取っていた理由でした。この回答では、このエラーの最も一般的な原因が考慮されていますが、他の回答では考慮されていません。
FirstFraktal、2015

1
Excelシートからデータをインポートしましたが、実際にはセルのnull値に「NULL」が含まれていました。これはDBテーブルで文字列「Null」として設定されたため、文字列「Null」を日時に変換しようとしました。Excelの「NULL」セルを空にする必要があります。私はばかです:/
karol

17

簡単な答え-5はイタリア語の「yyyy」、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)

動作します。


8

以下のように日付形式を更新するだけです

yyyy-MM-dd hh:MM:ss

それは私のために問題を解決し、それはうまくいきます


2
すでに提供されている他の回答を読んでください。このフォーマットは、セッションDATEFORMAT設定のためにのみ機能します。を実行してこれを確認しますSET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);Tセパレータ(yyyy-MM-ddTHH:mm:ss)を追加すると、確実に機能します。
Dan Guzman

1
どうもありがとうございます。正解です。問題は解決しました。ここに記載されている他の回答も読んでいます
Pronab Roy 2017

8

可能な限り、カルチャ固有の日付/時刻リテラルは避けてください

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

すべての例 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関数が--NO--特定のオーダー・オブ・実行を意味するものではない」こことはされ、関連する質問が


3

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

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

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,

1
最初のスペースではなくバックティックを使用すると、ワードラップが発生します。
ZでのジェシーW-

2

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

yyyy-mm-dd hh:MM:ss

1
いいえ、これは正しくありません(mおよびの不一致を除い てM)。Pronab Royの回答に対するDan Guzmanのコメントを読んでください。そして、他の答えをここで読んでください...
Shnugo 2017年

2

ぜひお試しください。

SQL Serverは、MM / DD / YYYY形式の日付を想定しています。英語がデフォルトの言語として設定されている場合。ここでは、datepicker値をsql2008データベースに保存します。私のフィールドタイプは、datetimeのdatetimeです。

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

次に、挿入クエリでdobを使用します。



1

getdate()nvarcharフィールドに挿入していた文字列に連結しようとすると、この問題が発生しました。

私はそれを回避するためにいくつかのキャストを行いました:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

これは消毒された例です。その重要な部分は次のとおりです。

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

日付をとしてキャストしdatetime2、次にそれnvarcharを連結します。



0

web.configファイルからカルチャを英語に設定する

  <globalization uiCulture="en-US" culture="en-US" />

たとえば、文化をアラビア語に設定した場合、thimeは

/ 2017年22/09 2時16分57秒ص

そして、あなたはエラーを得ます:datetimeを挿入している間に文字列から日付および/または時間を変換するとき、変換は失敗しました



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.