如何在Memgraph中获取LocalDateTime属性的最小值?
解决LocalDateTime类型无法使用MIN聚合函数的问题
报错原因很明确:你使用的MIN聚合函数仅支持布尔、数值、字符串类型,而LocalDateTime是日期对象类型,不在允许的聚合类型范围内。
解决思路是先把LocalDateTime转换成支持的类型(字符串或数值),聚合后再转回LocalDateTime即可,下面是两种可行方案:
转换为ISO格式字符串
ISO标准的日期字符串(如2024-05-20T14:30:00)是按时间顺序自然排序的,直接对这类字符串取MIN就能得到最早的时间。示例代码:// 假设v是目标对象,先转成ISO字符串再取min String earliestDateTimeStr = yourStream.map(v -> v.getDateTime().toString()) .min(String::compareTo) .orElse(null); // 将结果转回LocalDateTime LocalDateTime earliestDateTime = earliestDateTimeStr != null ? LocalDateTime.parse(earliestDateTimeStr) : null;转换为时间戳(数值类型)
将LocalDateTime转换成对应的时间戳(秒或毫秒级数值),取MIN后再转回到LocalDateTime。示例代码:// 转成UTC时区的秒级时间戳并取min long earliestTimestamp = yourStream.mapToLong(v -> v.getDateTime().toEpochSecond(ZoneOffset.UTC)) .min() .orElse(0); // 将时间戳转回LocalDateTime LocalDateTime earliestDateTime = LocalDateTime.ofEpochSecond(earliestTimestamp, 0, ZoneOffset.UTC);
注意:如果是在数据库查询中遇到这个问题,直接用数据库原生的日期聚合函数即可(比如MySQL的MIN(datetime_column)本身支持日期类型,无需手动转换);但如果是内存集合的聚合操作(比如Java Stream),就需要用上述转换方法。
内容的提问来源于stack exchange,提问作者Taja Jan
相关产品推荐
相关产品推荐

