sqlite在整合到springboot后遇到问题,时间时区问题及查询问题

在sqlite中,遇到了一些问题

问题一:

初次接触sqlite创建表的时候,

CREATE TABLE sysConsumerLog2(
   id  LONG  PRIMARY KEY     NOT NULL,
   content           TEXT    NOT NULL,
   userName         CHAR(50)     NOT NULL,
   operation        CHAR(50),
   ip          CHAR(50)  NOT NULL,
    applicationId  LONG  NOT NULL,
    createDate  timestamp default (datetime(CURRENT_TIMESTAMP,'localtime'))
);

时间默认default (datetime(CURRENT_TIMESTAMP,‘localtime’))
在这里插入图片描述

这时查询出来封装对象时会报错,

Caused by: java.text.ParseException: Unparseable date: "2020-08-10 10:03:50" 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)
	... 93 more

这是因为正则验证的问题,将时间的默认格式改为default (strftime(’%Y-%m-%d %H:%M:%f’,‘now’))

CREATE TABLE sysConsumerLog3(
   id  LONG  PRIMARY KEY     NOT NULL,
   content           TEXT    NOT NULL,
   userName         CHAR(50)     NOT NULL,
   operation        CHAR(50),
   ip          CHAR(50)  NOT NULL,
    applicationId  LONG  NOT NULL,
    createDate  timestamp default (strftime('%Y-%m-%d %H:%M:%f','now'))
);

这时候插入的时间会是例如:
在这里插入图片描述

问题二:

开始创建的时候

CREATE TABLE sysConsumerLog3(
   id  LONG  PRIMARY KEY     NOT NULL,
   content           TEXT    NOT NULL,
   userName         CHAR(50)     NOT NULL,
   operation        CHAR(50),
   ip          CHAR(50)  NOT NULL,
    applicationId  LONG  NOT NULL,
    createDate  timestamp default (strftime('%Y-%m-%d %H:%M:%f','now'))
);

创建一条数据

INSERT INTO sysConsumerLog3  (id ,content , userName,operation, ip, applicationId) VALUES  (7980036502160744600,'test4','adm4','admin4','10.20.12.213',7980036502160744451);

这样创建是有问题的查询出来的时间与北京时间少了8小时
查询结果

select * from sysConsumerLog3;

在这里插入图片描述
时间少了8个小时,这个是因为时区的问题
在创建表的时候修改如下

CREATE TABLE sysConsumerLog3(
   id  LONG  PRIMARY KEY     NOT NULL,
   content           TEXT    NOT NULL,
   userName         CHAR(50)     NOT NULL,
   operation        CHAR(50),
   ip          CHAR(50)  NOT NULL,
    applicationId  LONG  NOT NULL,
    createDate  timestamp default (strftime('%Y-%m-%d %H:%M:%f','now','localtime'))
);

插入时的时间就正确了。

问题三:

我使用的java语言
在查询封装到对象是出现了,查询结果比通过SQL查询的少了8个小时
这时就可以在类上加注解

	@ApiModelProperty("创建时间 ")
	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
	private Date createDate;

规定类的时区“timezone = “GMT+8””,这样返回的结果就是北京时间了。

问题四:

需求中需要支持时间段查询:
在mapper中,如下查询语句

 @Select("SELECT id,content,userName,operation,ip,createDate FROM sysConsumerLog2 WHERE  createDate >=#{createDateBegin}  and createDate <= #{createDateEnd} and id in ( select id from sysConsumerLog2 ) ")
    List<SysConsumerLogModel> findSysLogList(Map map);

参数:

package com.dbapp.fly.sqlite.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

@ApiModel("日志信息")
@Data
public class SysLogVm implements Serializable {
    /**
     * 内容  db_column:content
     */
    @ApiModelProperty("内容")
    private String content;
    
    @ApiModelProperty("起始时间 ")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createDateBegin;

    @ApiModelProperty("终止时间 ")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date  createDateEnd;


}

controller层:

	@ApiOperation("根据条件获取系统日志")
    @GetMapping("/sysLog")
    public ResponseModel<List<SysLogDTO>> getSysLog(@ApiParam("查询条件") SysLogVm info, PageableVm pageVm ) {
        HashMap<String, Object> condition = new HashMap<>(16);
        if (info.getContent()!=null){
            condition.put("content",'%'+info.getContent()+'%');
        }
		condition.put("createDateBegin",info.getCreateDateBegin());
		condition.put("createDateEnd",info.getCreateDateEnd());
        List<SysConsumerLogModel> sysLogs=sysConsumerLogService.findPageSysConsumerLog(condition, pageVm.getOffset(), pageVm.getPageSize());
        if(sysLogs.size()==0){
            return ResponseModel.ok(new ArrayList<>(), ResponseCode.SUCCESS, "您所搜索的日志不存在!");
        }
		List<SysLogDTO> sysLogDTOS = sysLogs.stream().map(t -> {
            SysLogDTO sysLogDTO = new SysLogDTO();
            BeanUtils.copyProperties(t, sysLogDTO);
            return sysLogDTO;
        }).collect(Collectors.toList());
        return ResponseModel.ok(sysLogDTOS, ResponseCode.SUCCESS, "恭喜您,操作成功!");
    }

这时传入开始时间和结束时间查到的为空,问题的原因是需要将时间转换成字符串型

		condition.put("createDateBegin",info.getCreateDateBegin());
		condition.put("createDateEnd",info.getCreateDateEnd());

改为:

		condition.put("createDateBegin",getStringDate(info.getCreateDateBegin()));
		condition.put("createDateEnd",getStringDate(info.getCreateDateEnd()));
	/**
	 * 将时间转换为字符串型
	 * @param date
	 * @return
	 */
	public static String getStringDate(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String dateString = formatter.format(date);
        return dateString;
    }

这样就能查到结果了。

整合springboot代码参见:https://blog.csdn.net/qq_16613311/article/details/107906811

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值