一、背景
用户使用如下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. 使用AES加密时,结果不一样

    使用AES加密时,发现得到的结果不一致. python示例 from Crypto.Cipher import AES from Crypto.Util.Padding import pad from ...

  2. 切换Docker本地目录

    背景: df -h,发现docker默认的路径在/var/lib下,而且容量即将满掉. 对于欧拉系统来说,目录在/home,需要把docker目前的目录切换到/home下. 解决方法: 1. Dock ...

  3. 清理docker logs

    1,docker ps找到id [root@mysql3 /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d8 ...

  4. 获取公众号openid,通过unionid 和小程序用户绑定起来

    时间仓促,暂时记录一下,有问题请留言 背景:目前客户项目有两套系统.一套暂时定为A系统,另一套为B系统,两套系统下有不同的公众号,小程序. 需求:B系统为用户端系统,需要发送公众号模板消息,所以需要用 ...

  5. IOS中的Context Menu

    IOS中的Context Menu 通过长按组件或者3D touch方式,周边全部虚化,弹出一个可操作的菜单,并且菜单之间也可以嵌套 IOS13之后已经弃用UIViewControllerPrevie ...

  6. NATS: 自定义服务 (Service)

    使用 NATS 服务框架来创建服务会变得非常简单,基于 NATS 的服务框架,NAST 的客户端库可以更简单的构建.服务发现和监控服务.服务框架自动将所有的订阅归类到一个队列组中,提供构建基于层次化的 ...

  7. 金TECH频道|最近备受关注的“应用重构”到底是什么?

    "金TECH频道"旨在为您分享中电金信助力行业数字化转型的最新产品业务动态.技术观点洞察与应用实践案例.让我们在这里,与行业发展同频共振,共筑数字新基石.

  8. 【Web前端】【疑难杂症】轮播图图片自适应显示问题(bootstrap3轮播图)

    关键代码 html <!-- 轮播图开始--> <div id="header" class="carousel slide"> < ...

  9. 【报错解决】【Python】'Failed to import pydot. You must pip install pydot and install graphviz (https://graphviz.gitlab.io/download/), ', 'for pydotprint to work.'

    可视化函数式API的形式seq2seq模型的过程中发生报错. 报错内容: 'Failed to import pydot. You must pip install pydot and install ...

  10. 【Mybatis】学习笔记02:实现简单的查

    Mybatis02:简单的查 如果你没先去学 增删改 ,然后直接看这篇记录,我想会有些困难.因为该文写的很粗劣,只是简单的截图.所以没基础的建议先去看 [Mybatis]学习笔记01:连接数据库,实现 ...