在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