Mysql查询参数为日期类型

一:时区查询    

       打开终端窗口,输入mysql -uroot -p,我们进入mysql。


       SELECT CURTIME();
       查询mysql系统的时间和当前时间进行对比,如果在使用系统的时间,那么时间就会一致。

     查询系统的时区

       SHOW VARIABLES LIKE "%time_zone%";


    sytem_time_zone是mysql系统的时区(readonly参数,只能通过更改cnf文件生效),一般是cst我国的使用的标准时间,CST +8:00既我国标准时区。

    time_zone是连接进来的会话的时区(如果会话不显示指定时区的话)(参数可以直接修改),默认值为SYSTEM,SYSTEM表示时区为sytem_time_zone的值

二:修改时区


    注意如上图set global,set global是全局参数,没有global仅是会话级的 ,只更改当前会话的时区

    可通过select now();查看时间是否正常

    最后需要输入FLUSH PRIVILEGES;刷新一下即可。

    date -R查看操作系统时区

    [root@lzl ~]# date -R
    Thu, 03 Sep 2020 15:40:27 +0800 (表示的为东八区)

三:日期类型作为参数进行查询

     1.因为要用到@JsonFormat注解和工具类DateUtils,所以先在pom.xml中添加相关包的依赖:

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
</dependency>

       2.POJO类上需要加上指定的注解

       在实体类的日期属性上,我们需要加上@JsonFormat注解,利用它的pattern属性来进行时间的格式化,利用timezone属性来解决时差问题。“GMT+8”表示我们在东八区,不然我们收到前端传来的时间有可能相差8个小时。

UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,领先UTC八个小时。

另一种解决办法:serverTimezone=Asia/Shanghai   #设置时区为亚洲上海

其中pattern表示返回数据的格式。


      3.日期传入

以为到这里就没什么问题了,其实坑才刚开始……

  1.     一,不能用Date类型直接去接参数,必须先用String类对象去接到参数 ,然后再用DateUtils的pasteDate函数将其转换为Date类对象。
  2.     二,因为实体类中包含日期属性,所以在添加数据的时候也不能直接用实体类去获取前端传过来的参数
  3.     三,一般做项目的时候需要规定前端以什么方式给后端传参,比如说json、form表单,url等,因为不同的传参方式会对应不同的注解。


3.1:使用json类型的参数进行数据传递

        本次是以json方式传参,这里用@RequestBody + Map接收前端传过来的键值对。里面用到的DateUtils.parseDate()函数的第一个参数是表示时间的字符串,第二个参数是时间的格式(参照SimpleDateFormat类时间格式的写法)。

    @RequestMapping(path = "/find3")
    public List<Message> findBetween(@RequestBody Map<String, Object> params) {
        Date startDate = null;
        Date endDate = null;
        try {
        	//第一个参数是表示时间的字符串,第二个参数是时间的格式
            startDate = DateUtils.parseDate((String)params.get("startDate"), "yyyy-MM-dd HH:mm:ss");
            endDate = DateUtils.parseDate((String)params.get("endDate"), "yyyy-MM-dd HH:mm:ss");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return marRepository.findByDropDateBetween(startDate, endDate);
    }


3.2:   使用字符串类型进行日期数据传递

    下面是使用RestFul风格的方式通过字符串进行传递

@RequestMapping("/getTAKeywordsCntRation/{date}")
    public List<TAdKeywordsCntRatio> getTAKeywordsCntRationByDate(@PathVariable String date) {
        return taKeywordsCntRationService.selectByExample(date);
    }


@Override
    public List<TAdKeywordsCntRatio> selectByExample(String date) throws ParseException {
        TAdKeywordsCntRatioExample example = new TAdKeywordsCntRatioExample();
        TAdKeywordsCntRatioExample.Criteria criteria=example.createCriteria();
        //使用工具类确定一下传入日期的格式类型
        Date date2 = DateUtils.parseDate(date, "yyyy-MM-dd");
        //把字符串封装成date类型的数据,通过日期查询数据
        criteria.andDsEqualTo(date2);
        return tAdKeywordsCntRatioMapper.selectByExample(example);
    }

到此结束,如果问题欢迎留言评论。

全部评论