'0000-00-00 00:00:00' tidak dapat direpresentasikan sebagai kesalahan java.sql.Timestamp


141

Saya memiliki tabel database yang berisi tanggal

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

Saya menggunakan MySQL. Dari program terkadang data dilewatkan tanpa tanggal ke database. Jadi, nilai tanggal ditetapkan secara otomatis 0000-00-00 00:00:00 ketika data tabel dipanggil dengan kolom tanggal yang memberikan kesalahan

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

Saya mencoba meneruskan nilai nol ke tanggal saat memasukkan data, tetapi data tersebut ditetapkan ke waktu sekarang.

Apakah ada cara saya bisa mendapatkan ResultSettanpa mengubah struktur tabel?

Jawaban:


302

Anda dapat menggunakan URL JDBC ini secara langsung dalam konfigurasi sumber data Anda:

jdbc: mysql: // server Anda: 3306 / database Anda? zeroDateTimeBehavior = convertToNull


2
ingin tahu. Membaca jawaban yang lain, ya, tidak ada bulan nol. Apa artinya ini?
Thufir

2
Apakah Anda tahu jika ada setara MariaDB untuk ditambahkan ke URL jdbc saya? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull sepertinya tidak bekerja untuk saya.
jeffkempf

Harus CONVERT_TO_NULL untuk saya
routeburn

16

Apakah "tanggal" '0000-00-00 "adalah" tanggal "yang valid tidak relevan dengan pertanyaan." Ubah saja database "jarang merupakan solusi yang layak.

Fakta:

  • MySQL memungkinkan tanggal dengan nilai nol.
  • "Fitur" ini menikmati penggunaan luas dengan bahasa lain.

Jadi, jika saya "hanya mengubah database", ribuan baris kode PHP akan rusak.

Pemrogram Java harus menerima tanggal nol MySQL dan mereka harus mengembalikan tanggal nol ke dalam basis data, ketika bahasa lain bergantung pada "fitur" ini.

Seorang programmer yang terhubung ke MySQL perlu menangani null dan 0000-00-00 serta tanggal yang valid. Mengubah 0000-00-00 menjadi nol bukanlah opsi yang dapat dilakukan, karena Anda tidak dapat lagi menentukan apakah tanggal tersebut diharapkan menjadi 0000-00-00 untuk penulisan kembali ke database.

Untuk 0000-00-00, saya sarankan memeriksa nilai tanggal sebagai string, kemudian mengubahnya ke ("y", 1), atau ("yyyy-MM-dd", 0001-01-01), atau menjadi tidak valid Tanggal MySQL (kurang dari tahun 1000, iirc). MySQL memiliki "fitur" lain: tanggal rendah secara otomatis dikonversi ke 0000-00-00.

Saya menyadari saran saya adalah kludge. Namun begitu juga dengan penanganan tanggal MySQL. Dan dua kludges tidak memperbaikinya. Faktanya adalah, banyak programmer harus menangani nol-tanggal MySQL selamanya .


9

Tambahkan pernyataan berikut ke protokol JDBC-mysql:

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

sebagai contoh:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

5
Hati-hati dengan pendekatan ini. Ini bekerja seperti pesona tetapi menurunkan server produksi pada kami (bekerja dengan sempurna di dev meskipun ...). Apa yang kami pelajari adalah bahwa Anda perlu mengutip string sebagai & ditafsirkan sebagai karakter khusus dalam beberapa konteks memberikan garis makna yang sama sekali berbeda ...
Techmag

6

Alih-alih menggunakan tanggal palsu seperti 0000-00-00 00:00:00atau 0001-01-01 00:00:00(yang terakhir harus diterima karena merupakan tanggal yang valid), ubah skema basis data Anda, untuk memungkinkan NULLnilai.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

Sebagai perubahan haluan luar biasa, ketika Anda tidak dapat melakukan perubahan pada kolom tanggal Anda atau untuk memperbarui nilai-nilai, atau ketika modifikasi ini terjadi, Anda dapat melakukan pilih menggunakan case / kapan.

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;

1

Saya bergulat dengan masalah ini dan mengimplementasikan solusi penggabungan URL yang disumbangkan oleh @Kushan dalam jawaban yang diterima di atas. Ini bekerja dalam instance MySql lokal saya. Tetapi ketika saya menempatkan aplikasi Play / Scala saya ke Heroku, itu tidak lagi berfungsi. Heroku juga menggabungkan beberapa argumen ke URL DB yang mereka sediakan kepada pengguna, dan solusi ini, karena penggunaan gabungan Heroku dari "?" sebelum set argumen mereka sendiri, tidak akan bekerja. Namun saya menemukan solusi berbeda yang tampaknya berfungsi sama baiknya.

SET sql_mode = 'NO_ZERO_DATE';

Saya memasukkan ini ke dalam deskripsi tabel saya dan memecahkan masalah '0000-00-00 00:00:00' tidak dapat direpresentasikan sebagai java.sql.Timestamp


1

Anda dapat mencoba seperti ini

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);
}

0

Tidak ada tahun 0000 dan tidak ada bulan 00 atau hari 00. Saya sarankan Anda mencoba

0001-01-01 00:00:00

Sementara satu tahun 0 telah didefinisikan dalam beberapa standar, itu lebih cenderung membingungkan daripada IMHO yang berguna.


2
Ya ada tahun 0000. infact tahun 0 dan kami memiliki tahun -1 dan tahun -1000. Tidak pernah melihat kalender Gregorian ini atau Anno Domini ini dan lebih khusus lagi kalender Gregorian tidak memiliki tahun nol tetapi iso telah dan iso digunakan dan komputer dapat melihat 0 tahun
botenvouwer

@sirwilliam Terima kasih atas kualifikasi yang menarik itu. Tampaknya OP ingin tahun 0 diperlakukan sebagai NULL atau sesuatu yang tidak ada.
Peter Lawrey

1
Dalam MySQL 0000-00-00 00:00:00 sama dengan 0. Dalam kode lama mungkin ada beberapa pertanyaan yang bergantung pada ini.
Juha Palomäki

0

hanya melemparkan bidang sebagai char

Misalnya: cast (updatedate) sebagai char as updatedate


0

Saya tahu ini akan menjadi jawaban yang terlambat, namun inilah jawaban yang paling benar.

Di database MySQL, ubah timestampnilai default Anda menjadi CURRENT_TIMESTAMP. Jika Anda memiliki catatan lama dengan nilai palsu, Anda harus memperbaikinya secara manual.


ini juga tidak akan membantu.
Sunil Sharma

0

Anda dapat menghapus properti "bukan null" dari kolom Anda di tabel mysql jika tidak perlu. ketika Anda menghapus properti "bukan nol" tidak perlu untuk konversi "0000-00-00 00:00:00" dan masalah hilang.

Setidaknya bekerja untuk saya.


-2

Saya percaya ini adalah bantuan penuh untuk yang mendapatkan di bawah ini Pengecualian untuk memompa data melalui Logstash Error: logstash.inputs.jdbc - Pengecualian saat menjalankan permintaan JDBC {: exception => #}

Jawaban: jdbc: mysql: // localhost: 3306 / database_name? ZeroDateTimeBehavior = convertToNull "

atau jika Anda bekerja dengan mysql

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.