在进行数据库 DateTime 列比较出错
1、数据库中是 Datetime 类型,在 group 分组的时候,出错
表达式为
=A2.group(名称, 开标时间)。其中名称为 varchar,开标时间为 datetime
出现
错误
2020-07-28T14:00 与 2020-07-28T14:00 类型不符,java.time.LocalDateTime 与 java.time.LocalDateTime 不能比较
在 mysql 中,用 group by 是可以的
2、在分析一个表之前,要看一下各字段的统计信息
=A2.fno().new
(
A2.fname(~):Name,
A2.field(~).count():Count,
A2.field(~).icount():iCount,
var(A2.field(~)):var,
A2.field(~).max():max,
A2.field(~).min():min
,A2.field(~).median():median,
A2.field(~).avg():avg
)
如果该表中,其中有一个字段为 DateTime 类型,也是报同样的错
按照前面的解答。在连接 jdbc 的地方增加了图示内容。
但是还是不行。
用的是 mysql-connector-java-8.0.29.jar
希望能 fix 一下。尤其是第二个功能,看一下每个表各字段的统计特征,是非常有用,很方便。否则要每个时间字段,都要加 DateFormat 进行转换,很麻烦,并且针对第二种场景,也不好转换。
关于 LocalDateTime 的支持,是比较新的版本增加的功能,并不需要去添加“treatMysqlDatetimeAsTimestamp”的设置。如果正常支持,LocalDateTime 或者 LocalDate 在读入集算器或者报表后,就会被转成标准的 Timestamp 类型。相应集算器包的日期需晚于 23 年 10 月。
至于问题 2 中的式子,错误比较多,不清楚想要干什么。例如 T.fno(fieldname) 获取指定字段名的序号,不设 fieldname 则获得总字段数,那么用它去执行循环,就不明白到底想做什么事情了。至于 T.field() 这样的函数,并没有针对序表的无参数用法。
经过更多测试后有一些发现:LocalDateTime 的使用是 MySQL8.0.23 之后版本才有的处理,用 MySQL8.1.0 时,如果驱动也是 MySQL8.1.0,跟踪可以发现数据库返回的数据为 LocalDateTime,这类数据在目前的集算器中读入后会自动转换为 Timestamp;如果使用较低版本的 Mysql,或者较低版本的 mysql-connector-j,只要低于 8.0.23,在数据库返回的数据直接就会是 Timestamp,而非 LocalDateTime。至于“treatMysqlDatetimeAsTimestamp”的设置,这个属性在 8.2.0 以上的 connector 才会支持,默认为 false,设为 true 时会从数据库直接返回 Timestamp。
综上,主贴中的问题,应该是使用的集算器版本比较旧,并没有相应的 LocalDateTime 数据处理,更换新的 esproc-bin 包,或者用 mysql-connector-j-8.0.22 或更低版本的驱动,或者在 MySQL8.2.0 以上的版本中,用相应的 connector 连接时设置 treatMysqlDatetimeAsTimestamp=true
会不会是 mysql 的 jdbc 驱动版本太高了,据说从 mysql-connector-java-8.0.23.jar 开始会有各种想不到的日期时间问题。
找个旧版本的 jdbc 驱动试试,8.0.22 或者更旧的版本。
网上也有说在 url 参数后面加 serverTimezone=GMT%2B8 能解决一些问题,我没 MySQL,没得试,错了别见怪🙏
请提供更多信息,如 mysql 数据库版本,使用 mysql 的 jdbc 版本,数据表字段的类型及设置等,以供测试。
我用 Mysql8.0.20 测试,驱动用的是 mysql-connector-java-8.0.17.jar,对于 Datetime 类型的字段,获取是正常的,并不会出现无法比较的情况。
测试过用 8.0.17.jar 连接 Mysql8.1.0,是可以直接获得 Timestamp 数据的。确实可以试试用低版本驱动。另外请把出问题的驱动上传一下以便测试。
大佬,我是吃瓜群众😂,JDBC 驱动等题主回复上传吧🙏
我都没用 MySQL,老白觉得不好用。