今天遇到一个有关时间格式的问题,描述如下: 要将Long型的数据(时间戳)插入到数据库表中字段类型为Timestamp的字段中,出现无法转换的错误。
报错如下:
### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1499409182' for column 'Update_Time' at row 1
### The error may involve com.extracme.evshare.business.tserver.mapper.StationInfoMapper.updateStationInfo-Inline
### The error occurred while setting parameters
### SQL: update station_info set Operator_ID = ?, Station_Name = ?, Equipment_Owner_ID = ?, Country_Code = ?, Area_Code = ?, Address = ?, Service_Tel = ?, Station_Type = ?, Station_Status = ?, Park_Nums = ?, Station_Lng = ?, Station_Lat = ?, Construction = ?, Pictrues = ?, Update_Time = ? where Station_Id = ?
### Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1499409182' for column 'Update_Time' at row 1
; SQL []; Data truncation: Incorrect datetime value: '1499409182' for column 'Update_Time' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1499409182' for column 'Update_Time' at row 1] with root cause
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1499409182' for column 'Update_Time' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4235)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2825)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)
查找原因发现Long型的数据并不能直接插入成日期类型,即使是Timestamp类型的字段。
采用Mysql中的函数解决:
一、FROM_UNIXTIME()
这是时间戳转化为日期的函数。
sql语句测试:(SELECT FROM_UNIXTIME(1499409740)),当然函数中也可以添加参数,例如:’%Y %D %M %h:%i:%s %x’
更新某个字段:update station_info set Update_Time = FROM_UNIXTIME(1499409015) where Station_Id = ‘1’
二、UNIX_TIMESTAMP()
这是日期格式转化为时间戳的函数。
sql语句测试:SELECT UNIX_TIMESTAMP(‘2017-07-07 15:58:25’)
在使用了函数之后,问题成功解决。但是又产生了新的问题,将正确的时间戳保存到数据库之后,却发现时间显示不正确,比正确时间少了整整8个小时。百度之后发现原来是数据库时区配置问题,数据库所配置的时区可能还是UTC(英国)的时区,北京时区需要加上8小时,因此显示不正确。
网上有解决办法如下:
在配置文件my.ini里添加
[mysqld]
default-time-zone=+8:00
由于数据库是配置于服务器,因此没有通过这种方法解决。而是在代码中增加了8个小时的时间戳,然后再保存至数据库。(承认这种方法有点Low,但也是无奈呀,问题先记下来~)
还有一个问题就是在大量数据存储的情况下,使用了Mysql函数之后可能对性能会造成影响,这个日后还需要研究,能不能采用其他方式解决。
PS:
1.
获取当前时间戳的时候要——————-除以1000哦!!!
Long time = (System.currentTimeMillis()/1000);
2. sql中涉及到时间的比较
大于:>
小于:<;
例句:
select
Operator_ID,Station_Id,Station_Name,Equipment_Owner_ID,Country_Code,Area_Code, Address,
Service_Tel,Station_Type,Station_Status,Park_Nums, Station_Lng, Station_Lat,Construction,Pictrues
from station_info a
left join equipment_info b on a.Station_Seq = b.Station_Seq
left join connector_info c on b.Equipment_Seq = c.Equipment_Seq
where 1=1
<if test="LastQueryTime != null and LastQueryTime !=''">
and a.Update_Time >#{LastQueryTime,jdbcType=TIMESTAMP}
or b.Update_Time >#{LastQueryTime,jdbcType=TIMESTAMP}
or c.Update_Time >#{LastQueryTime,jdbcType=TIMESTAMP}
</if>
总结:数据库的东西需要多实践。
版权声明:本文为babylove_BaLe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。