加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

时间那些事儿---Incorrect datetime value: '' for co

发布时间:2020-12-12 15:58:37 所属栏目:百科 来源:网络整理
导读:【问题出现】 向数据库中插入时间有误 代码如下 : span style="font-size:18px;"// 获取时间pstmt.setTimestamp(6,new Timestamp(new Date().getTime()));System.out.println(newTimestamp(new Date().getTime())); pstmt.executeUpdate();/span 报错如下:

【问题出现】

向数据库中插入时间有误

代码如下:

<span style="font-size:18px;">// 获取时间
pstmt.setTimestamp(6,new Timestamp(new Date().getTime()));
System.out.println(newTimestamp(new Date().getTime()));
 
pstmt.executeUpdate();</span>
报错如下:


解决方案一:

代码:

<span style="font-size:18px;">// 获取时间
 
pstmt.setTimestamp(
6,newTimestamp(new Date().getYear(),new Date().getMonth(),newDate().getDay(),new Date().getHours(),newDate().getMinutes(),new Date().getSeconds(),0));
System.out.println(newTimestamp(new Date().getYear(),new Date()
.getMonth(),new Date().getDay(),0));
 
pstmt.executeUpdate();</span>

运行效果:


这是因为Timestamp对象中有一个方法:

<span style="font-size:18px;">    @Deprecated
    public Timestamp(int year,int month,intdate,int hour,int minute,intsecond,int nano) {
        super(year,month,date,hour,minute,second);
        if (nano > 999999999 || nano < 0){
            throw newIllegalArgumentException("nanos > 999999999 or < 0");
        }
        nanos = nano;
    }</span>

还有一个方法:

<span style="font-size:18px;">  public Timestamp(long time) {
        super((time/1000)*1000);
        nanos = (int)((time%1000) * 1000000);
        if (nanos < 0) {
            nanos = 1000000000 + nanos;
           super.setTime(((time/1000)-1)*1000);
        }
    }</span>

刚才出错用的也睡这个方法,那如果我就非得用参数为long的呢?请看解决方案二:

解决方案二

代码:

<span style="font-size:18px;">// 获取时间
java.util.Date nowDate = new java.util.Date();// 取当前时间
SimpleDateFormatdateFormat = new java.text.SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"); // 转换时间格式
Stringdate = dateFormat.format(nowDate);
 
pstmt.setTimestamp(6,Timestamp.valueOf(date));
System.out.println(Timestamp.valueOf(date));
 
pstmt.executeUpdate();
 </span>

结果也成功了:

以上两种解决方案只是曲线救国了,真正的问题并没有得到解决。因为既然Timestamp的两种构造方法都可以使用,为什么我直接获取系统时间(long类型)就会出错呢:

<span style="font-size:18px;">// 获取时间
 
pstmt.setTimestamp(6,new Timestamp(System.currentTimeMillis()));
System.out.println(System.currentTimeMillis());
 
pstmt.executeUpdate();</span>

然后我又发现了另外一个问题,当插入数据成功的时候,打印出来的时间的格式:

2016-09-15 11:08:22.0

当而插入数据失败的时候:打印出来的时间

new Timestamp(new Date().getTime())----2016-09-1508:42:29:975

new Timestamp(System.currentTimeMillis())----1473908535581,跟进方法经过计算,格式同上。

哈哈,到这里就知道问题在哪儿了,就是时间格式最后的毫秒的问题。但是为什么学习视频里就没出错呢?经过查资料得知,视频里使用的是oracle数据,我实践的时候用的是mysql数据库。而oracle已经在date数据类型上扩展出来了timestamp数据类型,也就是说,它包括了所有date数据类型的年月日时分秒的信息,而且包括了小数秒的信息。而在mysqldate类型存放的是单纯的日期,time类型是单纯的时间,datetimetimestamp都是YYYY-MM-DD HH:MM:SS。而我们引用java.util.Date获取的时间是2016-09-15 08:42:29:975,所以当然会出错了。

找到问题所在,解决问题就随便选择一种解决就好啦。顺便也了解了以下几个知识点:

1.java.util.Datejava.sql.Date

http://www.cnblogs.com/humanchan/p/3546549.html

2.oracle数据库中的date类型数据

http://www.cnblogs.com/java-class/p/4742740.html


3.mysql数据库中的datedatetimetimestamp

http://www.2cto.com/database/201205/130951.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读