V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
guodastanson
V2EX  ›  Java

碰上一个问题, mybatis 和 navicat 中输入同样的 sql 但是查到的结果不一样

  •  
  •   guodastanson · 2019-04-30 10:54:56 +08:00 · 4571 次点击
    这是一个创建于 2018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    java web 项目,用的 springboot 构建的,数据库是 mysql 写了个 select 语句,控制台输出的 sql 如下 select id, duty_type, date, tips from schedule s where s.date BETWEEN ? AND ? 2019-04-30 10:43:17.226 DEBUG 3148 --- [nio-7777-exec-9] c.i.i.dao.ScheduleMapper.selectByDate : ==> Parameters: 2019-02-13(Date), 2019-04-23(Date)

    然后在 navicat 中输入查询的 sql 如下 select id, duty_type, date, tips from schedule s where s.date BETWEEN '2019-04-10' AND '2019-04-23' ;

    在我看来是一模一样的,但是实际上通过 mybatis 查到的结果相当于直接查询 between '2019-04-10' AND '2019-04-22' 也就是说要少了一天 数据库中 date 的数据类型也是 date,这个问题很让我困惑,不知道有没有大佬告知一下。

    16 条回复    2019-04-30 16:52:43 +08:00
    Citrus
        1
    Citrus  
       2019-04-30 11:04:12 +08:00 via iPhone   ❤️ 1
    是你打错了,还是你没看清。。。日期完全不一样啊。。。
    kidtest
        2
    kidtest  
       2019-04-30 11:06:34 +08:00   ❤️ 1
    mybatis 查询好像确实有这个问题,https://www.cnblogs.com/EasonJim/p/7513743.html
    guodastanson
        3
    guodastanson  
    OP
       2019-04-30 11:08:46 +08:00
    @Citrus 没打错,日期我看 mybatis 跟 navicat 一模一样,但是结果就是会差一天的数据
    guodastanson
        4
    guodastanson  
    OP
       2019-04-30 11:09:23 +08:00
    @kidtest 先谢后看,谢谢
    guodastanson
        5
    guodastanson  
    OP
       2019-04-30 11:21:10 +08:00
    @kidtest 已经解决,手动给他调成 23:59:59 了
    TommyLemon
        6
    TommyLemon  
       2019-04-30 12:18:30 +08:00
    检查配置,charset,timezone 等
    w292614191
        7
    w292614191  
       2019-04-30 13:51:26 +08:00
    and date <= '2019-05-30' and date >='2019-04-30'。
    between : and date< '2019-05-30' and date > '2019-04-30'。
    一个包含?一个包含?
    我也不知道,瞎猜的。
    walkman660
        8
    walkman660  
       2019-04-30 13:57:16 +08:00
    管那么多干嘛,以服务器上 mysql 命令行查出来的为准肯定没问题
    哪个客户端和 mysql 命令行查出来的不一样,哪个客户端就是有问题
    ETiV
        9
    ETiV  
       2019-04-30 14:00:15 +08:00 via iPhone
    找个数据库开 general log,看收到的是啥
    不写 Java,但看到了( Date ),盲猜是帮你转了和数据库不一致的时区的时间
    guodastanson
        10
    guodastanson  
    OP
       2019-04-30 14:13:21 +08:00
    @ETiV 不是时区问题,上面有朋友给出答案了,确实是 mybatis 的锅
    guodastanson
        11
    guodastanson  
    OP
       2019-04-30 14:13:50 +08:00   ❤️ 1
    @w292614191 between 就是包含,锅还是在 mybatis
    guodastanson
        12
    guodastanson  
    OP
       2019-04-30 14:14:10 +08:00
    @TommyLemon utf-8,东八区这都没问题
    fmumu
        13
    fmumu  
       2019-04-30 14:40:30 +08:00 via Android
    mybatis 里参数类型用的 Date,navicat 用的字符串,肯定不一样啊
    hhhzccc
        14
    hhhzccc  
       2019-04-30 16:30:17 +08:00   ❤️ 1
    比如:2019-04-23 17:20:00 不在你那个 between and 里面。oracle,mysql 要注意这个问题。不想精确到分秒可以:date '2019-04-23' +1 或者:date '2019-04-23 23:59:59'。
    silentstorm
        15
    silentstorm  
       2019-04-30 16:47:38 +08:00
    因为没有写时间,所以都是按照 00:00:00 来计算的,区间的右端肯定不包含当天了。
    MajorAdam
        16
    MajorAdam  
       2019-04-30 16:52:43 +08:00
    这个不是 bug 啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4646 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:01 · PVG 18:01 · LAX 02:01 · JFK 05:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.