'0000-00-00 00:00:00'不能表示为java.sql.Timestamp错误

时间:2012-06-21 07:50:23

标签: java mysql jdbc 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.......

我尝试将空值传递给插入数据的日期,但它会分配给当前时间。

有没有办法在不更改表格结构的情况下获得ResultSet

12 个答案:

答案 0 :(得分:274)

您可以直接在数据源配置中使用此JDBC URL:

  

JDBC:MySQL的:// yourserver:3306 / yourdatabase zeroDateTimeBehavior = convertToNull

答案 1 :(得分:14)

“date”'0000-00-00“是否为有效”日期“与问题无关。 “只是改变数据库”很少是一个可行的解决方案。

事实:

  • MySQL允许日期值为零。
  • 此“功能”广泛用于其他语言。

因此,如果我“只是更改数据库”,数千行PHP代码将会中断。

Java程序员需要接受MySQL零日期,当其他语言依赖此“功能”时,他们需要将零日期放回数据库。

连接MySQL的程序员需要处理null和0000-00-00以及有效日期。将0000-00-00变为null并不是一个可行的选择,因为那样你就不能再确定日期是否是用于写回数据库的日期。

For 0000-00-00,我建议将日期值检查为字符串,然后将其更改为(“y”,1)或(“yyyy-MM-dd”,0001-01-01),或者进入任何无效的MySQL日期(少于1000年,iirc)。 MySQL还有另一个“功能”:低日期会自动转换为0000-00-00。

我意识到我的建议是一个蠢货。但MySQL的日期处理也是如此。 并且两个kludges没有做对。事实是,许多程序员必须永远处理MySQL零日期

答案 2 :(得分:6)

不要使用0000-00-00 00:00:000001-01-01 00:00:00之类的假日期(后者应该被接受,因为它是有效日期),而是更改数据库架构,以允许NULL值。

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

答案 3 :(得分:6)

将以下语句附加到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

答案 4 :(得分:3)

作为一个外部转换,当您无法更改日期列或更新值时,或者在进行这些修改时,您可以使用case / when进行选择。

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;

答案 5 :(得分:1)

我解决了这个问题,并在上​​面接受的答案中实现了@Kushan提供的URL连接解决方​​案。它在我的本地MySql实例中工作。但是当我将我的Pl​​ay / Scala应用程序部署到Heroku时,它不再有效。 Heroku还将几个args连接到他们为用户提供的DB URL,这个解决方案,因为Heroku使用了串联“?”在他们自己的一套args之前,将无法正常工作。然而,我发现了一种似乎同样有效的不同解决方案。

SET sql_mode = 'NO_ZERO_DATE';

我把它放在我的表格描述中,它解决了问题     '0000-00-00 00:00:00'不能表示为java.sql.Timestamp

答案 6 :(得分:1)

你可以试试这个

@webapp.route('/monitor', methods=['GET', 'POST'])
def monitor():

    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    # path = sys.argv[1] if len(sys.argv) > 1 else '.'
    path = 'I:\\Projects\\files\\.'
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    return 'monitor script running'

答案 7 :(得分:0)

没有0000年,也没有00或00日。我建议你试试

0001-01-01 00:00:00

虽然在某些标准中定义了0年,但它更有可能比有用的恕我直言更令人困惑。

答案 8 :(得分:0)

将该字段强制转换为char

例如:cast(updatedate)as char as updatedate

答案 9 :(得分:0)

我知道这将是一个迟到的答案,但这是最正确的答案。

在MySQL数据库中,将timestamp默认值更改为CURRENT_TIMESTAMP。如果您的旧记录包含假值,则必须手动修复它们。

答案 10 :(得分:0)

如果没有必要,可以从mysql表中的列中删除“not null”属性。当你删除“not null”属性时,不需要“0000-00-00 00:00:00”转换,问题就消失了。

至少为我工作。

答案 11 :(得分:-2)

我相信这对于通过logstash抽取数据的人来说是完全有用的 错误:logstash.inputs.jdbc - 执行JDBC查询时出现异常{:exception =>#}

答案:jdbc:mysql:// localhost:3306 / database_name?zeroDateTimeBehavior = convertToNull“

或者如果你正在使用mysql