2012-06-21 54 views
115

Tôi có một bảng cơ sở dữ liệu chứa số ngày'0000-00-00 00:00:00' không thể được biểu diễn dưới dạng java.sql.Timestamp lỗi

(`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 tự động gán cho 0000-00-00 00:00:00 khi dữ liệu bảng được gọi với cột ngày nó mang lại cho lỗi

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

tôi đã cố gắng để vượt qua giá trị null cho đến nay 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 ResultSet mà không thay đổi cấu trúc bảng

cảm ơn trước

Trả lời

234

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 bạn:

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

+0

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 gì? – Thufir

+15

điều này sẽ là mặc định cho trình điều khiển jdbc mysql. – bradvido

+0

Giải quyết vấn đề của tôi.Cảm ơn bạn. –

0

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

0001-01-01 00:00:00 

Trong khi một năm 0 đã được xác định trong một số tiêu chuẩn, có nhiều khả năng khó hiểu hơn IMHO hữu ích.

+2

Có có một năm 0000. Infact năm của nó 0 và chúng tôi có một năm -1 và một năm -1000. Không bao giờ thấy [Lịch Gregorian] (https://en.wikipedia.org/wiki/Gregorian_calendar) hoặc [Anno Domini] (http://en.wikipedia.org/wiki/Before_Christ) và đặc biệt hơn về lịch Gregorian không có một năm không, nhưng iso có và iso được sử dụng máy tính bij xem [0 năm] (http://en.wikipedia.org/wiki/0_ (năm)) – botenvouwer

+0

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

+1

Trong MySQL 0000-00-00 00:00:00 bằng 0. Trong mã cũ có thể có một số truy vấn dựa vào điều này. –

7

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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL 
+0

cơ sở dữ liệu đã được trao cho tôi. tôi không thể chỉnh sửa nó. nhưng cảm ơn –

+0

Tôi cố gắng cho phép NULL, không hoạt động! –

1

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

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

8

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

sự kiện:.

  • MySQL al thấp một ngày với giá trị của số không.
  • Tính năng "" này được 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 nghìn dòng mã PHP sẽ bị hỏng.

Lập trình viên Java cần chấp nhận số không ngày của MySQL mà họ cần phải đặ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 nếu ngày được mong đợi là 0000-00-00 để viết lại cơ sở dữ liệu.

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

Tôi nhận thấy đề xuất của tôi là một kludge. Nhưng như vậy là xử lý ngày của MySQL. Và hai kludges 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.

5

Nối báo cáo kết quả sau đây để các 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 
+1

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

3

Là một bước ngoặt exteme, khi bạn không thể làm một thay đổi để cột ngày của bạn 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 một 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; 
0

chỉ đúc sân khi char

Ví dụ: dàn diễn viên (UpdateDate) như char như UpdateDate

0

Tôi biết điều nà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, hãy thay đổi giá trị mặc định timestamp thành CURRENT_TIMESTAMP. Nếu bạn có hồ sơ cũ với giá trị giả, bạn sẽ phải sửa chúng theo cách thủ công.

-1

Tôi tin rằng đây là giúp đầy đủ cho người đang nhận được ngoại lệ bên dưới này vào dữ liệu bơm 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/database_name zeroDateTimeBehavior = convertToNull"

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

0

bạn có thể loại bỏ các "không null" tài sản từ cột trong bảng mysql nếu không cần thiết?. khi bạn xóa thuộc tính "không rỗng", không cần chuyển đổi "0000-00-00 00:00:00" m đã biến mất.

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

1

bạn có thể thử như 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); 
} 
Các vấn đề liên quan