日期时间属性,日期时间函数相关问题

  • nebula 版本:3.1.0

  • 部署方式: 单机

  • 安装方式: RPM

  • 是否为线上版本: N

  • 时区配置为:UTC+08:00

  • 问题的具体描述

问题1:


根据时间函数的描述,我理解datetime应该是无论是什么时区都返回UTC时间才对。但是我测试的并不是。
image
这几个函数的结果与文档示例的并不一致,datetime还是东八区的时间。

问题2:
find path的时间和match的时间结果不一致,match的结果是真实数据导入的。

问题3:
find path 的边过滤条件==不生效,但是!=是生效的。
真实数据是17:13:37,但是因为问题2,显示的是不对的。



使用等于,无论是真实时间还是find path 展示的时间都是无法匹配的。

使用不等于可以过滤,说明是匹配到了时间的。

以上问题麻烦排查一下,另外关于时间这块感觉有点乱,能否详细说明下。

1 个赞

console会将时区转换成你本机设置的时区,想观察这个现象得直接用graph client查询

这个问题确实是在client端先发现,然后才在console验证
client端find path的结果时间跟console是一样的

能给一下 space product_1007 相关点边的 schema 吗?

点
+-----+-----------------------------------+
| Tag | Create Tag                        |
+-----+-----------------------------------+
| "c" | "CREATE TAG `c` (                 |
|     |  `zf` string NULL,                |
|     |  `zs` int64 NULL,                 |
|     |  `xs` double NULL,                |
|     |  `be` bool NULL,                  |
|     |  `rq` date NULL,                  |
|     |  `sj` time NULL,                  |
|     |  `rqsj` datetime NULL,            |
|     |  `sjc` int64 NULL                 |
|     | ) ttl_duration = 0, ttl_col = """ |
+-----+-----------------------------------+
边
+------+-----------------------------------+
| Edge | Create Edge                       |
+------+-----------------------------------+
| "cc" | "CREATE EDGE `cc` (               |
|      |  `eventtime` int64 NULL,          |
|      |  `zf` string NULL,                |
|      |  `zs` int64 NULL,                 |
|      |  `xs` double NULL,                |
|      |  `be` bool NULL,                  |
|      |  `rq` date NULL,                  |
|      |  `sj` time NULL,                  |
|      |  `rqsj` datetime NULL,            |
|      |  `sjc` int64 NULL                 |
|      | ) ttl_duration = 0, ttl_col = """ |
+------+-----------------------------------+

关于 console 中 datetime 返回的不是 UTC 时间,我没有复现,我用 3.1.0 版本试了下 console 返回的 datetime 确实是 UTC 时间。

RETURN now(),  timestamp(), date(), time(), datetime();
+------------+-------------+------------+-----------------+----------------------------+
| now()      | timestamp() | date()     | time()          | datetime()                 |
+------------+-------------+------------+-----------------+----------------------------+
| 1677122473 | 1677122473  | 2023-02-23 | 03:21:13.649000 | 2023-02-23T03:21:13.649000 |
+------------+-------------+------------+-----------------+----------------------------+

➜  ~ date -d @1677122473
Thu 23 Feb 2023 11:21:13 AM CST

不知道是不是你 Linux 时间配置有哪里不一样?
关于查询语句不一致的问题,可以请 @jmq2020 帮忙定位下。


image
我这边确实是这样的,你的时区也是UTC+08:00吗

我的 timezone_name 没有配置。timezone_name 默认是 “UTC+00:00:00”,所以问题可能出在这。

console打印的时间是通过客户端转换过时区的

nebula保证时间类型数据插进去的和查出来的一样

嗯,那这样问题1应该没事了。
现在主要是find path 这个在时间的处理上有一点问题,在java client端测试发现find path 在解析时使用asNode转换后,timeZoneOffset是0,但是正常的这里应该有28800是对的。

然后另外一个问题就是find path过滤条件不生效。

贴图里datetime函数输入字符串格式不对

那是什么格式呢?带T还是需要把时区也加上呢?

看了下发现这个格式也支持的 日期时间 - NebulaGraph Database 手册

timeZoneOffset 是客户端鉴权时候从服务端拿的, 一个 session 的 timeZoneOffset 肯定是一样的, 你看除 path 外其他结构的 timeZoneOffset 正常吗, 如果只有 path 中的 node 时区不对那可能是bug

另外看看 return 你红框中的过滤条件看一下算出来的值具体多少

path的解析是只有find path 有问题,match的path也是没问题的

你问题二中 match 语句返回的是一个点, 不是一条路径, 试下用 match p=()… return p, 这才是返回一个路径

测试了下match return path 确实时间也不一样,那这样时间不统一啊 :sweat_smile:

客户端对path内时间类型属性解析有问题, 我提个issue记下

https://github.com/vesoft-inc/nebula-go/issues/257

另一个问题有答复吗?find path 边属性过滤不生效的问题

应该是路径中utc where 条件里做了时区转换导致匹配不上 上面issue已经修了

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。