首页 > 数据库 >(随笔)关于java自动以unix时间戳格式接收Date数据类型导致的sql查询时间失误问题的相关研究

(随笔)关于java自动以unix时间戳格式接收Date数据类型导致的sql查询时间失误问题的相关研究

时间:2023-08-22 10:47:31浏览次数:56  
标签:00 java String 数据类型 value sql Date import

前言

​ 在进行项目开发的时候,有遇到过mapper执行sql语言查询指定时间范围内或截止时间之前的数据时不查询当天时间内不同时分秒时的数据,接口实现逻辑为前端传入Date类型(精度为yyyy-MM-dd)起止时间,mapper.xml文件中通过concat_ws方法实现时间精度转换(数据库内数据精度为yyyy-MM-dd HH:mm:ss),查询结果再通过json格式返回前端。

代码

   <if test="cashierBrushListReqVO.gmtCreatedStart != null and cashierBrushListReqVO.gmtCreatedStart != ''">
       AND cbc.gmt_created <![CDATA[>=]]> CONCAT_WS(' ',#{cashierBrushListReqVO.gmtCreatedStart},'00:00:00')
    </if>
    <if test="cashierBrushListReqVO.gmtCreatedEnd != null and cashierBrushListReqVO.gmtCreatedEnd != ''">
        AND cbc.gmt_created <![CDATA[<=]]> CONCAT_WS(' ',#{cashierBrushListReqVO.gmtCreatedEnd},'23:59:59')
    </if>
package com.nuanwa.app.flow.share.cashier.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.nuanwa.app.flow.share.utils.result.PageVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.util.List;
import java.util.Map;

/**
 * @author pangyangjian
 * * @date 2023/6/16
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "CashierBrushListReqVO对象", description = "查询接口请求参数")
public class CashierBrushListReqVO extends PageVO {
	
	@ApiModelProperty(value = "商户号")
	private String merchantCode;
	
	@ApiModelProperty(value = "一级渠道编码")
	private String channelCode;
	
	@ApiModelProperty(value = "二级渠道编码")
	private String channelSource;
	
	@ApiModelProperty(value = "创建开始时间")
	@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
	private Date gmtCreatedStart;

	@ApiModelProperty(value = "创建结束时间")
	@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
	private Date gmtCreatedEnd;
	
	@ApiModelProperty(value = "商户号-一级渠道编码")
	private List<Map<Object,Object>> list;
}

解释

​ 已知,vo接受类中开始时间和结束时间都设置为Date类型,并且通过JsonFormat注解表明了变量的时间格式。测试数据为json格式的

{
    "gmtCreatedStart": 2023-07-10,
    "gmtCreatedEnd": 2023-07-10
}

​ 在查阅log输出日志后可以发现,在执行sql语句查询时间的时候判断的时间数值并不是输入的时间 2023-07-10,而是1688918400,即预期中的sql语句

AND cbc.gmt_created >= 2023-07-10 00:00:00
AND cbc.gmt_created <= 2023-07-10 23:59:59

​ 变成了

AND cbc.gmt_created >= 1688918400
AND cbc.gmt_created <= 1688918400

​ 在查阅了大量文献资料后得知,在idea中java接收并转换成Date类型的时间参数时自动以Unix时间戳的格式进行转换存储,即输入的2023-07-10在java中由String转换成Date类型的时候自动转换成1688918400,因此在执行mapper.xml文件中组装动态sql语句的时候出现了错误,查询语句出错自然无法查询2023-07-10 00:00:00和2023-07-10 23:59:59之间的数据。

解决方法

​ 目前来说总体有两种解决方案:

  1. 改变vo接受类中相关参数的数据类型,将Date改成String类型进行存储,因此java在接收Json格式数据的时候无需将时间参数转换成Date,而是直接以String类型赋值给vo接受类中的相关参数,举例:将上段vo接受类中的开始时间和结束时间的Date类型改成String类型

    	@ApiModelProperty(value = "创建开始时间")
    	@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    	private String gmtCreatedStart;
    
    	@ApiModelProperty(value = "创建结束时间")
    	@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    	private String gmtCreatedEnd;
    
  2. 自定义String类型转换成Date类型方法,即通过SimpleDateFormat类进行指定时间格式的数据转换,比如说

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Main {
        public static void main(String[] args) {
            String dateString = "2021-08-25 09:30:00";
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
            try {
                Date date = dateFormat.parse(dateString);
                System.out.println(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }
    

总结

​ 综上所述,在进行数据接收的时候一定要注意java后端存储数据的方式。
​ 希望这篇文章能够帮到你 :p

标签:00,java,String,数据类型,value,sql,Date,import
From: https://www.cnblogs.com/Joseph-Jonardo/p/17647883.html

相关文章

  • 12 JavaScript 关于eval函数
    12eval函数eval本身在js里面正常情况下使用的并不多.但是很多网站会利用eval的特性来完成反爬操作.我们来看看eval是个什么鬼?从功能上讲,eval非常简单.它和python里面的eval是一样的.它可以动态的把字符串当成js代码进行运行.s="console.log('我爱你')";eval(s);也......
  • (随笔)Mysql 查询字段所在表的表名
    要确定某个字段在哪张表中,您可以执行数据库查询操作以查找该字段的存在位置。以下是一种常见的方法:连接到数据库:使用适当的连接信息和凭据,连接到包含这些表的数据库。执行查询操作:编写一个查询语句,通过查找所有表的元数据信息来确定字段的存在位置。例如,在MySQL中,您可以使......
  • Web_PHP_MySQL_XAMPP下MYSQL中文乱码问题的解决
    1、找到xampp安装目录下的D:\xampp\mysql\bin\my.ini文件并打开; 2、找到标记[mysqld]和标记[mysql]两处; 3、在这2处标记下分别添加编码配置信息:default-character-set=gbk;修改后如下:->Ini代码 [mysql] no-auto-rehash default-character-set=gbk  [mysql......
  • Web_JavaScript_客户端监测;
    //client_detection.js客户端监测//client自动运行varclient=function(){//呈现引擎varengine={ie:0,gecko:0,webkit:0,khtml:0,opera:0,//完整版本号ver:null......
  • Java_swing_边框简单实现
    ->效果->源码//:Show.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/***//显示框架*@authorcyb_23*/publicclassShow{ /** *框架 *@paramjp *@paramwidth *@paramheight */ publicstaticvoidinFrame(JPane......
  • Web_PHP_DedeCMS_{dede:sql}标签用法;
    {dede:sqlsql='selecta.title,a.litpic,z.expert,d.level,d.titles,d.resumefromdede_archivesasa,dede_addonzjtbasz,dede_addondocterasdwherea.id=z.aidandz.expert=d.nameANDa.litpicisnotnullGROUPBYa.titleLIMIT2'} <div......
  • Java_读取xml文件;
    功能:java读取xml文件源码;=>person.xml<?xmlversion="1.0"encoding="UTF-8"?><book> <persona='av'b='bv'> <first>wang</first> <last>laohu</last> <age>25</a......
  • Java_面试题目冰山一角
    特别说明:这些都是偶然遇到的题目(有些是同僚说到,有些是群里说到,有些是书籍提到,总之就是偶然遇到),没有指导作用,切记!再加上正好有空闲,就贴上来供大家探讨,有什么意见建议也可以直接评论什么的!谢谢大家的光临!1、已知Pi可以用函数4*(1–1/3+1/5–1/7+…)计算,项越多越精确,请写......
  • postgresql 查询重复,多行合并
    --postgresql--替换字符串UPDATEtmpSETphone=REPLACE(phone,'myzs','');--查询替换中间4位为*SELECTCONCAT_WS('****',SUBSTR(phone,1,3),SUBSTR(phone,8))asnew_phone_numberFROMtmp;--更新手机号为中间四位为*UPDATEtmpsetnewphone=C......
  • Java_J2EE_轻量_J2EE应用框架;
    ......