我有一个包含日期的数据库表
(`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
不改变表结构?
您可以在数据源配置直接使用此JDBC网址:
JDBC:MySQL的:// yourserver:3306 / yourdatabase zeroDateTimeBehavior = convertToNull
Whether or not the "date" '0000-00-00" is a valid "date" is irrelevant to the question.
"Just change the database" is seldom a viable solution.
Facts:
- MySQL allows a date with the value of zeros.
- This "feature" enjoys widespread use with other languages.
So, if I "just change the database", thousands of lines of PHP code will break.
Java programmers need to accept the MySQL zero-date and they need to put a zero date back into the database, when other languages rely on this "feature".
A programmer connecting to MySQL needs to handle null and 0000-00-00 as well as valid dates. Changing 0000-00-00 to null is not a viable option, because then you can no longer determine if the date was expected to be 0000-00-00 for writing back to the database.
For 0000-00-00, I suggest checking the date value as a string, then changing it to ("y",1), or ("yyyy-MM-dd",0001-01-01), or into any invalid MySQL date (less than year 1000, iirc). MySQL has another "feature": low dates are automatically converted to 0000-00-00.
I realize my suggestion is a kludge. But so is MySQL's date handling.
And two kludges don't make it right. The fact of the matter is, many programmers will have to handle MySQL zero-dates forever.
除了使用假日期一样的0000-00-00 00:00:00
或0001-01-01 00:00:00
(后者应该被接受,因为它是一个有效的日期),更改数据库架构,允许NULL
值。
ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
追加下面的语句到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
作为exteme周转,当你不能做一个ALTER你的日期列或更新的值,或在这些修改发生时,您可以使用的情况下/时做一个选择。
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实例。 但是,当我部署我的播放/斯卡拉应用的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);
}
有没有0000年,没有00月00或一天,我建议你试试
0001-01-01 00:00:00
虽然一年0已经在一些标准定义,它更可能会比有用恕我直言混乱。
只投领域为char
如:投(updatedate)为char作为updatedate
我知道这将是一个迟到的回答,但这里是最正确的答案。
在MySQL数据库,更改timestamp
默认值到CURRENT_TIMESTAMP
。 如果你有旧记录与假的价值,你必须手动修复它们。
如果没有必要,可以删除MySQL表从列“不空”属性。 当您删除“非空”属性不需要“0000-00-00 00:00:00”转换和问题走了。
至少为我工作。
我相信这是帮助充满了对谁都是通过logstash错误得到这下面异常上抽数据:logstash.inputs.jdbc - 异常时执行JDBC查询{:异常=>#}
答:JDBC的:mysql://本地主机:3306 /数据库名称zeroDateTimeBehavior = convertToNull”
或者如果你正在使用MySQL