怎么比较两个日期

【问题】
tag A 的属性-createTime 是Datetime类型,业务需要查询某一个日期范围内的数据,只要数据的创建时间符合搜索范围就认为是有效数据,现在使用下面的语句,执行时间耗时1.X秒(图空间当前数据 95k条数据),想问问还有没有什么方法可以优化?

MATCH (v: A) WHERE date(toString( v.createTime )) >= date(XXXX) and date(toString( v.createTime)) RETURN v

  • nebula 版本:
  • 部署方式:分布式
  • 安装方式:RPM
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘( 推荐使用 SSD)
    • CPU、内存信息

不转换直接比呢,时间类型数字底层是数字的,直接可比较。
虽然您这里只关心日期,可以把时间换成某一个时区的 0 时,这省去了你现在写法里的 toString() 再 date()

CREATE TAG IF NOT EXISTS school(name string , found_time timestamp);
CREATE TAG INDEX date_index on school(found_time);
(root@nebula) [basketballplayer]> INSERT VERTEX school(name, found_time) VALUES "DUT":("DUT", timestamp("1988-03-01T08:00:00"));
Execution succeeded (time spent 6964/9980 us)

Wed, 17 Nov 2021 07:49:06 UTC

(root@nebula) [basketballplayer]> INSERT VERTEX school(name, found_time) VALUES "foo":("foo", timestamp("1998-04-01T08:00:00"));
Execution succeeded (time spent 5790/9676 us)

Wed, 17 Nov 2021 07:49:11 UTC

(root@nebula) [basketballplayer]> INSERT VERTEX school(name, found_time) VALUES "bar":("bar", timestamp("2000-04-01T08:00:00"));
Execution succeeded (time spent 5855/8444 us)

Wed, 17 Nov 2021 07:49:15 UTC

(root@nebula) [basketballplayer]> MATCH (v: school) WHERE v.found_time > timestamp("1998-04-01T08:00:00") return v
+-----------------------------------------------------+
| v                                                   |
+-----------------------------------------------------+
| ("bar" :school{found_time: 954576000, name: "bar"}) |
+-----------------------------------------------------+
Got 1 rows (time spent 33992/39306 us)

Wed, 17 Nov 2021 07:49:54 UTC

1 个赞

原始数据是从其他平台集成过来的,所以存储到数据库的时候需要跟原始数据保持一致,请问还有其他方法吗?

您的情况是 schema 里日期存成了 string,如果是 string的话也不需要 toString(),直接 date() 就够了吧?

另外如果是的话“集成的过程中”为什么做不到把它存成 datetime 么?

集成的时候已经存成dateTime类型了,但是 datetime类型不能直接转成date,所以需要先转成string,再转date

只需要比较日期,具体的时间不用比较

嗯嗯,那直接和这个日期作比较就可以了哈,比如你关心的是 GMT + 8 的,和 1998-04-01 就是和 timestamp("1998-04-01T08:00:00") 比较

要过滤的时间范围是接口A从图数据库里面查询的,然后作为接口B的入参 作为查询周期过滤条件的

ok,过滤范围是这个形式的对吧 "2021-11-18" 在 query 里以 concat 起来,,比如是8时区,就用 timestamp转换成了 datetime,就可以直接比了,就省去了对 v.createTime 的批量转换了。

(root@nebula) [basketballplayer]> return timestamp((concat("2021-11-18","T08:00")))
+------------------------------------------+
| timestamp(concat("2021-11-18","T08:00")) |
+------------------------------------------+
| 1637222432                               |
+------------------------------------------+
Got 1 rows (time spent 831/2560 us)

过滤范围是这个形式: “2021-11-18T18:00:00.123”

那更好办了,直接用 timestamp 就可以和v.createTime 作比较了:

(root@nebula) [basketballplayer]> return timestamp(("2021-11-18T18:00:00.123"))
+--------------------------------------+
| timestamp("2021-11-18T18:00:00.123") |
+--------------------------------------+
| 1637258400                           |
+--------------------------------------+
Got 1 rows (time spent 1248/5335 us)
(root@nebula) [basketballplayer]>  MATCH (v: school) WHERE v.found_time > timestamp("1998-04-01T08:00:00.123") return v
+------------------------------------------------------------------------------------------------------+
| v                                                                                                    |
+------------------------------------------------------------------------------------------------------+
| ("bar" :school{found_time: 954576000, name: "bar"})                                                  |
| ("player100" :school{found_time: 954576000, name: "player100"} :player{age: 42, name: "Tim Duncan"}) |
+------------------------------------------------------------------------------------------------------+
Got 2 rows (time spent 11175/15701 us)

Thu, 18 Nov 2021 14:53:23 UTC

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