153

日付を含むデータベーステーブルがあります

 (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 

MySQLを使用しています。プログラムから、データが日付なしでデータベースに渡されることがあります。0000-00-00 00:00:00 したがって、テーブルデータが日付列で呼び出されると、日付値が自動的に割り当てられ、エラーが発生します

...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......

データを挿入するときに日付にnull値を渡そうとしましたが、現在の時刻に割り当てられます。

ResultSetテーブル構造を変更せずにを取得する方法はありますか?

4

12 に答える 12

329

このJDBCURLは、データソース構成で直接使用できます。

jdbc:mysql:// yourserver:3306 / yourdatabase?zeroDateTimeBehavior = convertToNull

于 2012-06-21T08:00:06.487 に答える
19

「日付」「0000-00-00」が有効な「日付」であるかどうかは、質問とは無関係です。「データベースを変更するだけ」が実行可能な解決策になることはめったにありません。

事実:

  • MySQLでは、値がゼロの日付が許可されます。
  • この「機能」は、他の言語で広く使用されています。

したがって、「データベースを変更するだけ」では、数千行のPHPコードが壊れます。

他の言語がこの「機能」に依存している場合、JavaプログラマーはMySQLのゼロ日付を受け入れる必要があり、ゼロ日付をデータベースに戻す必要があります

MySQLに接続するプログラマーは、nullと0000-00-00、および有効な日付を処理する必要があります。0000-00-00をnullに変更することは実行可能なオプションではありません。これは、データベースに書き戻すために日付が0000-00-00であると予想されていたかどうかを判断できなくなるためです。

0000-00-00の場合、日付値を文字列として確認してから、( "y"、1)、( "yyyy-MM-dd"、0001-01-01)、または無効な値に変更することをお勧めしますMySQLの日付(1000年未満、iirc)。MySQLには別の「機能」があります。低い日付は自動的に0000-00-00に変換されます。

私の提案は応急修理だと思います。しかし、MySQLの日付処理もそうです。そして、2つの応急修理はそれを正しくしません。問題の事実は、多くのプログラマーがMySQLのゼロ日付を永久に処理しなければならないということです。

于 2013-02-14T11:29:25.433 に答える
11

次のステートメントをJDBC-mysqlプロトコルに追加します。

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

例えば:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
于 2014-06-06T05:03:51.823 に答える
7

0000-00-00 00:00:00またはのような偽の日付を使用する代わりに0001-01-01 00:00:00(後者は有効な日付であるため受け入れられる必要があります)、データベーススキーマを変更してNULL値を許可します。

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
于 2012-06-21T07:59:01.277 に答える
5

極端なターンアラウンドとして、日付列を変更したり値を更新したりできない場合、またはこれらの変更が行われている間に、case/whenを使用して選択を行うことができます。

SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1;
于 2015-08-10T15:28:44.617 に答える
1

私はこの問題に取り組み、@Kushanによって提供されたURL連結ソリューションを上記の受け入れられた回答に実装しました。それは私のローカルのMySqlインスタンスで機能しました。しかし、Play / ScalaアプリをHerokuにデプロイすると、機能しなくなりました。Herokuは、ユーザーに提供するDB URLにいくつかの引数を連結します。このソリューションは、Herokuが「?」を連結して使用しているためです。独自の引数セットの前では、機能しません。しかし、私は同じようにうまくいくように見える別の解決策を見つけました。

SET sql_mode = 'NO_ZERO_DATE';

これをテーブルの説明に入れて、「0000-00-0000:00:00」の問題を解決しました。java.sql.Timestampとして表すことができません。

于 2013-01-15T23:33:35.870 に答える
1

あなたはこのように試すことができます

ArrayList<String> dtlst = new ArrayList<String>();
String qry1 = "select dt_tracker from gs";

Statement prepst = conn.createStatement();
ResultSet rst = prepst.executeQuery(qry1);
while(rst.next())
{
    String dt = "";
    try
    {
        dt = rst.getDate("dt_tracker")+" "+rst.getTime("dt_tracker");
    }
    catch(Exception e)
    {
        dt = "0000-00-00 00:00:00";
    }

    dtlst.add(dt);
}
于 2017-12-20T08:18:15.240 に答える
0

0000年はなく、00月も00日もありません。試してみることをお勧めします。

0001-01-01 00:00:00

一部の規格では0年が定義されていますが、有用なIMHOよりも混乱を招く可能性があります。

于 2012-06-21T07:53:18.857 に答える
0

フィールドをcharとしてキャストするだけです

例:cast(updatedate)as char as updateate

于 2016-06-03T06:36:18.770 に答える
0

私はこれが遅い答えになることを知っています、しかしここに最も正しい答えがあります。

MySQLデータベースで、timestampデフォルト値をに変更しますCURRENT_TIMESTAMP。偽の値を持つ古いレコードがある場合は、手動で修正する必要があります。

于 2016-12-06T07:54:55.337 に答える
0

必要がない場合は、mysqlテーブルの列から「notnull」プロパティを削除できます。「notnull」プロパティを削除すると、「0000-00-00 00:00:00」変換の必要がなくなり、問題がなくなります。

少なくとも私のために働いた。

于 2017-07-11T15:15:45.267 に答える
-2

これは、logstashを介したデータのポンピングの例外エラー:logstash.inputs.jdbc-JDBCクエリの実行時の例外{:exception =>#}の下でこれを取得している人にとっては完全な助けになると思います

回答:jdbc:mysql:// localhost:3306 / database_name?zeroDateTimeBehavior = convertToNull "

または、mysqlを使用している場合

于 2017-03-27T06:45:04.863 に答える