web-dev-qa-db-ja.com

'0000-00-00 00:00:00'をタイムスタンプに変換できません

フィールド定義

 /** Date. */
  @Column(columnDefinition = "datetime")
  private Date date;

セッター

public void setDate(final Date date) {
    DateFormat dfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
      this.date = dfmt.parse(dfmt.format(date));
    } catch (ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

「ゼロ日付」を適切な値に変換する方法を知っている人はいますか?エラーがあるため:

Cannot convert value '0000-00-00 00:00:00' from column 13 to TIMESTAMP

そして、私が「デフォルト」フィールドとセッターをこのように設定したとしても:

/** Date. */
      @Column
      private Date date;


public void setDate(final Date date) {
      this.date = date;   
  }

私はまだ同じ問題を抱えています...

28
Oleksandr

ここでは、MySQLを使用していると大げさに推測します:-)「ゼロ日付」を 特別なプレースホルダー として使用します-残念ながら、JDBCはデフォルトでそれらを処理できません。

解決策は、MySQL接続へのパラメーターとして(データソースURLまたは追加のプロパティとして)「zeroDateTimeBehavior = convertToNull」を指定することです。例:

jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull

これにより、そのようなすべての値がNULLとして取得されます。

67
ChssPly76

コード内で、日付をフォーマットしてから再度解析するポイントがわかりません。これは同じ操作のようです。たぶんあなたは詳しく説明できますか?


日付にデフォルト値を指定する場合は、次のようにします。

/** Jan 1, 1970 ; first moment in time in Java */
private static final Date NO_DATE = new Date(0L);

private Date date;

public void setDate(final Date date) {
     if (date == null) {
         this.date = NO_DATE;
     } else {
         this.date = date;
     }
}

注:注釈はオプションです。ここでは追加しませんでした。

このコードでは、必要なものを条件とデフォルト値に置き換えることができます。

文字列引数を取る同様のセッターを追加して、特別な「00000 ...」値を確認することもできます。これにより、日付または文字列を使用してフィールドを設定できます。

4
KLE