侧边栏

mybatis-sqlite日期类型对应关系

1.问题

sqlite数据库

user表,create_time字段,类型DATETIME,设置默认值datetime('now')

mybatis,User实体,createTime类型为java.util.Date

插入一条数据

    @Test
    @Transactional
    @Rollback(false)
    public void insert(){
        User user = new User();
        user.setId("3");
        user.setUsername("user1");
        user.setName("王五");
        user.setAge(18);
        userService.insert(user);
    }

查询数据

    @Test
    public void get(){
        try{
            List<User> list = userService.get();
            for(User user : list){
                System.err.println(user);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

抛出异常

Caused by: java.text.ParseException: Unparseable date: "2019-12-12 12:08:26" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
    at org.sqlite.date.FastDateParser.parse(FastDateParser.java:299)
    at org.sqlite.date.FastDateFormat.parse(FastDateFormat.java:490)
    at org.sqlite.jdbc3.JDBC3ResultSet.getTimestamp(JDBC3ResultSet.java:540)
    ... 77 more

2.解决问题

方法1(推荐):将url字符串修改如下

url: jdbc:sqlite:dataserver.pak?date_string_format=yyyy-MM-dd HH:mm:ss

 

方法2:将create_time字段默认值改为strftime('%s','now'),类型改为bigint,java类型改为Long,需要转Date再做转换

strftime('%s','now'),从1970年1月1日到现在的秒数

方法3:或者strftime('%Y-%m-%d %H:%M:%f','now')

3.sqlite获取当前时间

3.1获取当前时间:

select datetime('now')

结果:2017-04-12 09:47:12

3.2如果需要精确到毫秒,使用:

select strftime('%Y-%m-%d %H:%M:%f','now')

结果:2017-04-12 17:48:35.890

3.3获取从1970年1月1日到现在的秒数(Unix时间戳):

select strftime('%s','now') 

结果:1491985972

4.原理

sqlite将字符串转换为Date使用FastDateFormat转换

等同于下面代码

    @Test
    public void test() throws ParseException{
        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS");
        Date d = dateFormat.parse("2019-12-12 19:26:55");
        System.err.println(d);
    }

 

posted on 2019-12-12 20:47  SmilingEye  阅读(3712)  评论(0编辑  收藏  举报

导航