一、背景
用户使用如下sql来获取周开始和结束时间,直连presto查询该sql,得到的week_start=2019-12-30,而通过calcite-avatica查询出结果为week_start=2019-12-29.
日期相差一天。
with week_array as (
select
sequence(cast('2019-12-30' as date), current_date, interval '7' day) as date_array
)
select
week_start
, date_add('day', 6, week_start) as week_end
from week_array
cross join unnest(date_array) as t1 (week_start)
order by 1
 
二、问题排查
driver和server端,底层是通过http方式进行交互,查到底层是继承extends Meta.MetaResultSet的方法,对数据做压缩时,日期数据做了压缩。
case Types.DATE:
final Date aDate = resultSet.getDate(j + 1, calendar);
/*
* USql改源码--日期类型下面逻辑做了数据压缩,但是没考虑到时区问题
* 如用户查询日期类型2019-12-30转换成时间戳是1577635200000
* 下面逻辑对日期做了处理1577635200000/86400000 = 18259.666666666666667强转了整形得到18259
* 客户端那获取时用18259*86400000得到1577577600000 对应日期为2019-12-29 08:00:00
* 所以展示给用户是2019-12-29,展示错误。
* 解决方法
* 转换日期前加一个时区偏差8小时
* 1577635200000+28800000=1577664000000 压缩后1577664000000/86400000=18260
* 客户端拿到18260 * 86400000 = 1577664000000 对应日期 2019-12-30
*/
return aDate == null
? null
: (int) ((aDate.getTime()+28800000) / DateTimeUtils.MILLIS_PER_DAY);
 
(1)排查数据转化错误问题
18259 * 86400000
18259转为日期是2019-12-29
18260转为日期是2019-12-30
(2)数据获取到后判断date类型,是日期类型格式是2019-12-30
转成时间戳:1577635200000
(3)发送数据时对数据做了优化,日期类型/86400000相当于数据压缩后再做转发
1577635200000/86400000=18259.666666666666667
(4)取了个整,导致精度缺失,发送给客户端的数据是18259
(int) (aDate.getTime() / DateTimeUtils.MILLIS_PER_DAY)
(5)客户端获取时是18259
18259*86400000=1577577600000
转日期2019-12-29 08:00:00
(6)主要原因是服务端日期类型除86400000余数直接忽略导致
(7)2021-05-31 08:00:00 和 2021-05-31 00:00:00相差时间戳
2021-05-31 08:00:00 1622419200000
2021-05-31 00:00:00 1622390400000
 
三、解决方法
获取的时间戳需要加上8小时时间差,对应毫秒数28800000,然后再转日期
 
 
关注我一起学习成长,免费ChatGPT,本人开发的程序员工具箱可以提高开发效率欢迎您来体验:www.robots2.com
 

calcite-avatica数据传输时对日期类型压缩,导致客户端展示数据异常问题排查的更多相关文章

  1. SpringMVC在使用Jackson2时关于日期类型格式化的问题

    SpringMVC在使用Jackson2时关于日期类型格式化的问题 如果无效,那么使用 @DateTimeFormat(pattern = "yyyy-MM-dd")

  2. WebApi接收接收日期格式参数时,日期类型(2019-10-08T16:00:00.000Z)后台接收时间少8小时问题

    前端使用的是elementui的日期控件,将日期格式的数据提交到webapi后台时,接收到的日期格式少了8小时,这个原因是由于时区引起的,应该在WebApiConfig进行配置转成本地时间,解决少8小 ...

  3. Mysql 建表时,日期时间类型选择

    mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示  D ...

  4. Linux-定时任务-打包与压缩

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...

  5. java mysql 日期类型

    mysql(版本:5.1.50)的时间日期类型如下: datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59: ...

  6. Java 基础【09】 日期类型

    java api中日期类型的继承关系 java.lang.Object --java.util.Date --java.sql.Date --java.sql.Time --java.sql.Time ...

  7. SpringMVC对日期类型的转换

    在做web开发的时候,页面传入的都是String类型,SpringMVC可以对一些基本的类型进行转换,但是对于日期类的转换可能就需要我们配置. 1.如果查询类使我们自己写,那么在属性前面加上@Date ...

  8. spring mvc 注解访问控制器以及接收form数据的方式,包括直接接收日期类型及对象的方法

    Spring 中配置扫描器 <!-- springmvc的扫描器--> <context:component-scan base-package="com.beifeng. ...

  9. C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)

    在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...

  10. mysql 日期类型比较

    MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间       日期格式                 日期范围 ------------ ------ ...

随机推荐

  1. 基于python的文件监控watchdog

    实时监控第三方库watchdog,其原理通过操作系统的时间触发的,不需要循环和等待 使用场景: 1.监控文件系统中文件或目录的增删改情况 2.当特定的文件被创建,删除,修改,移动时执行相应的任务 1. ...

  2. pycharm之远程开发

    转载:https://amos-x.com/index.php/amos/archives/pycharm-remote/ 前言 远程开发什么意思? 远程开发就是用本地的个人电脑进行代码编写开发,但是 ...

  3. manim边做边学--圆柱体

    Cylinder是Manim中用于创建圆柱体对象的类. Cylinder类在制作数学.物理或工程领域的动画时,可用于以下的场景中: 演示几何概念:使用Cylinder类创建圆柱体,并通过改变其参数和方 ...

  4. Java8 Lambda编程常用技巧

    遍历打印List List<Integer> list= Arrays.asList(1,5,6,8,9,32,5,8,7,4,5); list.forEach(System.out::p ...

  5. winform窗体无边框拖动

    1:引用命名空间 using System.Runtime.InteropServices; 2:想要拖动窗体的控件绑定MouseDown事件 点击查看代码 //窗体移动 [DllImport(&qu ...

  6. 在docker中使用主机串口通讯

    在进行软件docker化的过程时,很大的一个阻碍就是软件与各种外围硬件设备的交互,网口通信的设备能够很容易地接入容器,但是串口设备则要复杂一些.本文讨论在windows和linux下docker容器使 ...

  7. 2024年1月Java项目开发指南13:登录注册实现

    创建文件,如上图 创建好文件后去router.index.js配置路由 import { createRouter, createWebHistory } from 'vue-router'; // ...

  8. 加入security+jwt安全策略

    Pom中引入 <!-- security --> <dependency> <groupId>org.springframework.boot</groupI ...

  9. Qt/C++音视频开发54-视频监控控件的极致设计

    一.前言 跌跌撞撞摸爬滚打一步步迭代完善到今天,这个视频监控控件的设计,在现阶段水平上个人认为是做的最棒的(稍微自恋一下),理论上来说应该可以用5年不用推翻重写,推翻重写当然也是程序员爱干的事情,这个 ...

  10. Qt编写安防视频监控系统36-onvif连续移动

    一.前言 时隔一年多,重新对视频监控系统的onvif内核重写,一方面为了兼容Qt6,一方面按功能分类提高效率.整体逻辑思路是一样的,主要的改动是由于Qt6不再支持QtXmlPatterns模块(其实这 ...