Cha*_*ake 138 java mysql timestamp jdbc
我有一个包含日期的数据库表
 (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 
Run Code Online (Sandbox Code Playgroud)
我正在使用MySQL.从程序中,有时数据会在没有日期的情况下传递到数据库.因此,日期值被自动分配给0000-00-00 00:00:00
调用表数据时,它会给出错误的日期列
...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......
Run Code Online (Sandbox Code Playgroud)
我尝试将空值传递给插入数据的日期,但它会分配给当前时间.
有没有什么方法可以在ResultSet不改变表结构的情况下得到它?
Kus*_*han 288
您可以直接在数据源配置中使用此JDBC URL:
JDBC:MySQL的:// yourserver:3306/yourdatabase zeroDateTimeBehavior = convertToNull
Unl*_*ity 15
"date"'0000-00-00"是否是有效的"日期"与问题无关."只是改变数据库"很少是一个可行的解决方案.
事实:
因此,如果我"只是更改数据库",数千行PHP代码将会中断.
Java程序员需要接受MySQL零日期,当其他语言依赖于这个"特性"时,他们需要将零日期重新放回数据库.
连接MySQL的程序员需要处理null和0000-00-00以及有效日期.将0000-00-00变为null不是一个可行的选择,因为那样你就不能再确定日期是否是用于写回数据库的函数.
对于0000-00-00,我建议将日期值检查为字符串,然后将其更改为("y",1)或("yyyy-MM-dd",0001-01-01),或任何无效MySQL日期(不到1000年,iirc).MySQL有另一个"功能":低日期会自动转换为0000-00-00.
我意识到我的建议是一个kludge.但MySQL的日期处理也是如此.并且两个kludges没有做对.事实是,许多程序员必须永远处理MySQL零日期.
小智 8
将以下语句附加到JDBC-mysql协议:
?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Run Code Online (Sandbox Code Playgroud)
例如:
jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Run Code Online (Sandbox Code Playgroud)
        除了使用假日期等0000-00-00 00:00:00或0001-01-01 00:00:00(因为它是一个有效的日期,后者应该被接受),更改数据库架构,允许NULL值.
ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
Run Code Online (Sandbox Code Playgroud)
        小智 5
作为一种极端的转变,当您无法更改日期列或更新值时,或者在进行这些修改时,您可以使用 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;
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           99796 次  |  
        
|   最近记录:  |