[java] ‘0000-00-00 00:00:00’은 java.sql.Timestamp 오류로 표시 할 수 없습니다

날짜가 포함 된 데이터베이스 테이블이 있습니다

 (`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테이블 구조를 변경하지 않고 얻을 수있는 방법이 있습니까?



답변

데이터 소스 구성에서이 JDBC URL을 직접 사용할 수 있습니다.

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


답변

“날짜” ‘0000-00-00 “이 유효한”날짜 “인지 여부는 질문과 관련이 없으며”데이터베이스 만 변경 “은 거의 불가능한 솔루션입니다.

사리:

  • MySQL은 값이 0 인 날짜를 허용합니다.
  • 이 “기능”은 다른 언어와 함께 널리 사용됩니다.

따라서 “데이터베이스 만 변경”하면 수천 줄의 PHP 코드가 손상됩니다.

자바 프로그래머는 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의 날짜 처리도 마찬가지입니다. 그리고 두 개의 kludges는 그것을 올바르게하지 않습니다. 문제는 많은 프로그래머가 MySQL 제로 날짜를 영원히 처리해야한다는 입니다.


답변

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


답변

0000-00-00 00:00:00또는 같은 가짜 날짜를 사용하는 대신 0001-01-01 00:00:00(후자는 유효한 날짜이므로 수락해야 함) NULL값 을 허용하도록 데이터베이스 스키마를 변경하십시오 .

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL


답변

극단적 인 처리 방법으로 날짜 열을 변경하거나 값을 업데이트 할 수 없거나 이러한 수정이 수행되는 동안 대 / 소문자를 사용하여 선택을 수행 할 수 있습니다.

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;


답변

나는이 문제로 씨름하고 위의 대답에서 @Kushan이 제공 한 URL 연결 솔루션을 구현했습니다. 내 로컬 MySql 인스턴스에서 작동했습니다. 그러나 Play / Scala 앱을 Heroku에 배포하면 더 이상 작동하지 않습니다. 또한 Heroku는 사용자에게 제공하는 DB URL에 여러 인수를 연결하며이 솔루션은 Heroku의 “?”연결로 인해이 솔루션을 제공합니다. 자신의 인수 집합 전에는 작동하지 않습니다. 그러나 나는 똑같이 잘 작동하는 것처럼 보이는 다른 솔루션을 발견했습니다.

SET sql_mode = 'NO_ZERO_DATE';

나는 이것을 내 테이블 설명에 넣고 ‘0000-00-00 00:00:00’의 문제를 java.sql.Timestamp로 표현 할 수없는 문제를 해결했다.


답변

당신은 이것처럼 시도 할 수 있습니다

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