一、背景
用户使用如下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. 21stUESTC

    数矩形 平面上有 \(n\) 个点,这 \(n\) 个点两两不重合.问这 \(n\) 个点可以组成多少个矩形 请注意:矩形的边不必平行于坐标轴. \(4 ≤ n ≤ 1000\) 保证这些点两两不重合 ...

  2. Codeforces Round 859 (Div

    F. Bouncy Ball 给定\(n×m\)矩形,起点\(st\),终点\(ed\),有一小球从起点出发,每次可以选择4个方向,如果碰到边界就反弹,询问最后能否到达终点 题解:\(DFS\) + ...

  3. 2-SQL注入渗透与攻防

    1.SQL注入基础 1.1 什么是sql注入 一.SQL注入概述 二.数据库概述 1.关系型数据库 关系型数据库,存储格式可以直观的反映实体间的关系,和常见的表格比较相似 关系型数据库中表与表之间有很 ...

  4. 一文聊清楚Redis主从复制原理

    本地缓存带来的挑战 分布式缓存相比于本地缓存,在实现层面需要关注的点有哪些不同.梳理如下: 维度 本地缓存 集中式缓存 缓存量 受限于单机内存大小,存储数据有限 需要提供给分布式系统里面所有节点共同使 ...

  5. linux 安装 docker

    1.安装 yum-utils yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken 执行如果 报错 ...

  6. Windows 触控笔

    平板以及二合一平板均是触控屏,Laptop现在也有很多屏幕带触控 触控屏,都会配置触控笔配件,目前市场上一般是电容屏+电容笔的技术方案. 触控笔分为主动笔和被动笔,主动笔占绝大部分.主动笔是通过内部电 ...

  7. 【MySQL】求和查询,目标值int,但空数据时返回null的问题(Java)

    问题分析 int selectDeviceMonthRepairCount(String deviceType, String month); <select id="selectDe ...

  8. 【MyBatis】学习笔记11:解决字段名和属性的映射关系

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  9. helm values reference other values

    https://helm.sh/docs/chart_template_guide/yaml_techniques/#yaml-anchors https://helm.sh/zh/docs/char ...

  10. Springboot 指定外部配置文件启动

    <resources> <resource> <directory>src/main/resources</directory> <filteri ...