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


141

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

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

답변:


302

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

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


2
궁금한. 다른 답변을 읽으면, 달이 없습니다. 이것이 실제로 무엇을 의미합니까?
Thufir

2
내 jdbc URL에 추가 할 MariaDB가 있는지 알고 있습니까? jdbc : mariadb : // localhost : 3306 / dev? zeroDateTimeBehavior = convertToNull이 작동하지 않는 것 같습니다.
jeffkempf

나를 위해 CONVERT_TO_NULL이어야했습니다
routeburn

16

"날짜" '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 제로 날짜를 영원히 처리해야한다는 입니다.


9

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

5
이 방법에주의하십시오. 그것은 매력처럼 작동하지만 프로덕션 서버가 다운되었습니다 (개발에서 완벽하게 작동했습니다 ...). 우리가 배운 것은 &는 라인이 완전히 다른 의미를주는 일부 상황에서 &를 특수 문자로 해석 할 때 문자열을 인용해야한다는 것입니다.
Techmag

6

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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

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

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

나는이 문제로 씨름하고 위의 대답에서 @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로 표현 할 수없는 문제를 해결했다.


1

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

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

0000 년은 없었으며 00 월 또는 00 일은 없습니다.

0001-01-01 00:00:00

일부 표준에서는 0 년이 정의되었지만 유용한 IMHO보다 혼동 될 가능성이 높습니다.


2
네, 0000 년이 있습니다. 실제로 0 년이며 우리는 -1과 -1000을 가지고 있습니다. 이 본 적이 태양력 또는이 서기 보다 Especialy는 그레고리력이없는 원년을하지만, 컴퓨터가 볼 bij는 ISO를 가지고 있으며, ISO를 사용 0년
botenvouwer

@sirwilliam 그 흥미로운 자격에 감사드립니다. OP 0 년이 NULL 또는 존재하지 않는 것으로 취급되기를 원합니다.
피터 로리

1
MySQL 0000-00-00에서 00:00:00은 0과 같습니다. 레거시 코드에는 이에 의존하는 일부 쿼리가있을 수 있습니다.
Juha Palomäki


0

나는 이것이 늦게 대답 할 것이라는 것을 알고 있지만 여기에 가장 정확한 대답이 있습니다.

MySQL 데이터베이스에서 timestamp기본값을로 변경하십시오 CURRENT_TIMESTAMP. 가짜 값을 가진 오래된 레코드가 있으면 수동으로 수정해야합니다.


이것은 또한 도움이되지 않습니다.
Sunil Sharma

0

필요하지 않은 경우 mysql 테이블의 열에서 "not null"속성을 제거 할 수 있습니다. "not null"속성을 제거하면 "0000-00-00 00:00:00"변환이 필요하지 않으며 문제가 사라집니다.

적어도 나를 위해 일했다.


-2

나는 이것이 아래에있는 사람에게 도움이된다고 생각합니다. logstash를 통해 데이터를 펌핑하는 예외 : logstash.inputs.jdbc-JDBC 쿼리 {: exception => #} 실행시 예외

답변 : jdbc : mysql : // localhost : 3306 / database_name? zeroDateTimeBehavior = convertToNull "

또는 mysql로 ​​작업하는 경우

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.