Mysql中关于时间戳与日期的转换

       今天遇到一个有关时间格式的问题,描述如下:  要将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>

          总结:数据库的东西需要多实践。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值