'0000-00-00 00:00:00' không thể được biểu thị dưới dạng lỗi java.sql.Timestamp


141

Tôi có một bảng cơ sở dữ liệu chứa ngày

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

Tôi đang sử dụng MySQL. Từ chương trình đôi khi dữ liệu được truyền mà không có ngày đến cơ sở dữ liệu. Vì vậy, giá trị ngày được gán tự động 0000-00-00 00:00:00 khi dữ liệu bảng được gọi với cột ngày mà nó báo lỗi

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

Tôi đã cố gắng chuyển giá trị null cho đến ngày khi chèn dữ liệu, nhưng nó được gán cho thời điểm hiện tại.

Có cách nào tôi có thể nhận được ResultSetmà không thay đổi cấu trúc bảng không?

Câu trả lời:


302

Bạn có thể sử dụng URL JDBC này trực tiếp trong cấu hình nguồn dữ liệu của mình:

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


2
Tò mò. Đọc các câu trả lời khác, duh, không có tháng nào. Điều này thực sự có nghĩa là gì?
Thufir

2
Bạn có biết nếu có MariaDB tương đương để nối vào URL jdbc của tôi không? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull dường như không hoạt động đối với tôi.
jeffkempf

Phải là CONVERT_TO_NULL cho tôi
tuyến

16

Việc "ngày" '0000-00-00 "có phải là" ngày "hợp lệ hay không không liên quan đến câu hỏi." Chỉ cần thay đổi cơ sở dữ liệu "là một giải pháp khả thi.

Sự thật:

  • MySQL cho phép một ngày với giá trị của số không.
  • "Tính năng" này thích sử dụng rộng rãi với các ngôn ngữ khác.

Vì vậy, nếu tôi "chỉ thay đổi cơ sở dữ liệu", hàng ngàn dòng mã PHP sẽ bị hỏng.

Các lập trình viên Java cần chấp nhận ngày không có MySQL họ cần đặt lại ngày không vào cơ sở dữ liệu, khi các ngôn ngữ khác dựa vào "tính năng" này.

Một lập trình viên kết nối với MySQL cần xử lý null và 0000-00-00 cũng như ngày hợp lệ. Thay đổi 0000-00-00 thành null không phải là một lựa chọn khả thi, bởi vì sau đó bạn không còn có thể xác định xem ngày dự kiến ​​là 0000-00-00 để ghi lại vào cơ sở dữ liệu hay không.

Đối với 0000-00-00, tôi khuyên bạn nên kiểm tra giá trị ngày dưới dạng chuỗi, sau đó thay đổi thành ("y", 1) hoặc ("yyyy-MM-dd", 0001-01-01) hoặc thành bất kỳ không hợp lệ Ngày MySQL (dưới 1000 năm, iirc). MySQL có một "tính năng" khác: ngày thấp được tự động chuyển thành 0000-00-00.

Tôi nhận ra đề nghị của tôi là một loại bùn. Nhưng xử lý ngày của MySQL cũng vậy. Và hai loại bùn không làm cho nó đúng. Thực tế của vấn đề là, nhiều lập trình viên sẽ phải xử lý MySQL zero- date mãi mãi .


9

Nối câu lệnh sau vào giao thức JDBC-mysql:

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

ví dụ:

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

5
Hãy cẩn thận với phương pháp này. Nó hoạt động như một bùa mê nhưng nó đã đánh sập một máy chủ sản xuất trên chúng tôi (hoạt động hoàn hảo trong dev mặc dù ...). Điều chúng tôi học được là bạn sẽ cần trích dẫn chuỗi là & được hiểu là một ký tự đặc biệt trong một số ngữ cảnh mang lại cho dòng có ý nghĩa hoàn toàn khác ...
Techmag

6

Thay vì sử dụng ngày giả như 0000-00-00 00:00:00hoặc 0001-01-01 00:00:00(ngày sau nên được chấp nhận vì đó là ngày hợp lệ), hãy thay đổi lược đồ cơ sở dữ liệu của bạn, để cho phép NULLcác giá trị.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

Là một sự thay đổi hoàn toàn, khi bạn không thể thay đổi cột ngày hoặc để cập nhật các giá trị hoặc trong khi các sửa đổi này diễn ra, bạn có thể thực hiện lựa chọn bằng cách sử dụng trường hợp / khi nào.

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

Tôi đã vật lộn với vấn đề này và thực hiện giải pháp nối URL được đóng góp bởi @Kushan trong câu trả lời được chấp nhận ở trên. Nó hoạt động trong ví dụ MySql cục bộ của tôi. Nhưng khi tôi triển khai ứng dụng Play / Scala của mình cho Heroku thì nó không còn hoạt động nữa. Heroku cũng kết hợp một số đối số với URL DB mà họ cung cấp cho người dùng và giải pháp này, do Heroku sử dụng phép nối "?" trước khi lập luận riêng của họ, sẽ không hoạt động. Tuy nhiên tôi tìm thấy một giải pháp khác có vẻ hoạt động tốt như nhau.

SET sql_mode = 'NO_ZERO_DATE';

Tôi đặt điều này trong các mô tả bảng của mình và nó đã giải quyết vấn đề '0000-00-00 00:00:00' không thể được biểu diễn dưới dạng java.sql.Timestamp


1

bạn có thể thử như thế này

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

Không có năm 0000 và không có tháng 00 hoặc ngày 00. Tôi khuyên bạn nên thử

0001-01-01 00:00:00

Mặc dù một năm 0 đã được xác định trong một số tiêu chuẩn, nó có nhiều khả năng gây nhầm lẫn hơn IMHO hữu ích.


2
Vâng, có một năm 0000. thực hiện năm 0 và chúng ta có một năm -1 và một năm -1000. Chưa bao giờ thấy lịch Gregorian này hoặc Anno Domini này và đặc biệt hơn nữa là lịch Gregorian không có năm nào nhưng iso có và iso được sử dụng máy tính bij xem 0 năm
botenvouwer

@sirwilliam Cảm ơn bạn vì trình độ thú vị đó. Có vẻ như OP muốn năm 0 được coi là NULL hoặc thứ gì đó không tồn tại.
Peter Lawrey

1
Trong MySQL 0000-00-00 00:00:00 bằng 0. Trong mã kế thừa có thể có một số truy vấn dựa trên điều này.
Juha Palomäki

0

chỉ cần chọn lĩnh vực như char

Ví dụ: cast (cập nhật) là char như cập nhật


0

Tôi biết đây sẽ là một câu trả lời muộn, tuy nhiên đây là câu trả lời đúng nhất.

Trong cơ sở dữ liệu MySQL, thay đổi timestampgiá trị mặc định của bạn thành CURRENT_TIMESTAMP. Nếu bạn có hồ sơ cũ với giá trị giả, bạn sẽ phải tự sửa chúng.


Điều này cũng sẽ không giúp đỡ.
Sunil Sharma

0

Bạn có thể xóa thuộc tính "không null" khỏi cột của mình trong bảng mysql nếu không cần thiết. khi bạn xóa thuộc tính "không null", không cần chuyển đổi "0000-00-00 00:00:00".

Ít nhất là làm việc cho tôi.


-2

Tôi tin rằng đây là trợ giúp đầy đủ cho những ai nhận được điều này bên dưới Ngoại lệ về việc bơm dữ liệu thông qua logstash Lỗi: logstash.inputs.jdbc - Ngoại lệ khi thực hiện truy vấn JDBC {: ngoại lệ => #}

Trả lời: jdbc: mysql: // localhost: 3306 / cơ sở dữ liệu? ZeroDateTimeBehavior = convertToNull "

hoặc nếu bạn đang làm việc với mysql

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.