一、背景
用户使用如下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. vue中去掉地址栏中的#

    mode设置成history就可以了

  2. PythonDay3Advance

    PythonDay3Advance 运算符 位运算符 进制: 将整数分了几种进制表示法 二进制:由0,1构成,逢2进1,以0b开头 八进制:由0,1,2,3,4,5,6,7构成,逢8进1,以0开头 十 ...

  3. jackson 中对 null 的处理

    前情提要: 在项目中如何将null值转变为空字符串呢? @Configuration public class JacksonConfig { @Bean @Primary @ConditionalO ...

  4. Python 在同一/或不同PDF之间复制页面

    操作PDF文档时,复制其中的指定页面可以帮助我们从PDF文件中提取特定信息,如文本.图表或数据等,以便在其他文档中使用.复制PDF页面也可以实现在不同文件中提取页面,以创建一个新的综合文档.本文将介绍 ...

  5. 解决Your project does not reference问题

    错误现象 vs编译时,报错: Your project does not reference ".NETFramework,Version=v##" framework. Add ...

  6. 《JavaScript 模式》读书笔记(4)— 函数3

    这篇,我们来学习下自定义函数以及即时函数的内容. 四.自定义函数 函数可以动态定义,也可以分配给变量.如果创建了一个新函数,并且将其分配给保存了另外函数的同一个变量,那么就以一个新函数覆盖了旧函数.在 ...

  7. GraphQL Part VII: 实现数据变更

    我们已经可以使用各种方式来获取数据了.但是如何修改服务器端的数据呢?包括数据插入,修补,删除或者更新等等.GraphQL 的 mutation 就是负责这部分的. 在我们继续之前,我想对项目做一点调整 ...

  8. Netty 中ChannelOption的含义以及使用的场景Netty 中ChannelOption的含义以及使用的场景

    一.概述 最近在写一个分布式服务框架,打算用netty框架做底层网络通信,关于netty的学习可以参考如下资料: http://blog.csdn.net/column/details/enjoyne ...

  9. Qt开源作品19-通用数据库翻页查询

    一.前言 在Qt与数据库结合编程的过程中,记录一多,基本上都需要用到翻页查看记录,翻页有个好处就是可以减轻显示数据的表格的压力,不需要一次性将数据库表的记录全部显示,也基本上没有谁在一页上需要一次性显 ...

  10. vue辅助函数mapState和mapGetter前面三个点到底是什么意思:对象展开运算符

    import store from "./store" computed: { useName: function() { return store.state.userName ...