日期和时间类型¶
本文介绍日期和时间的类型,包括DATE
、TIME
、DATETIME
、TIMESTAMP
和DURATION
。
注意事项¶
-
在插入时间类型的属性值时,NebulaGraph 会根据配置文件中
timezone_name
参数指定的时区,将该DATE
、TIME
、DATETIME
转换成相应的世界协调时间(UTC)时间。Note
如需修改当前时区,请同时修改所有服务的配置文件中的
timezone_name
参数。
- 函数
date()
、time()
和datetime()
可以指定时区进行转换,例如datetime("2017-03-04 22:30:40.003000+08:00")
或datetime("2017-03-04T22:30:40.003000[Asia/Shanghai]")
。
- 函数
date()
、time()
、datetime()
和timestamp()
可以用空值获取当前的日期或时间。
- 函数
date()
、time()
、datetime()
和duration()
可以用属性名称获取自身的某一个具体属性值,例如date().month
获取当前月份、time("02:59:40").minute
获取传入时间的分钟数。
Note
设置时间的年份为负数时,需要使用 Map 类型数据。
openCypher 兼容性¶
- 支持年、月、日、时、分、秒、毫秒、微秒,不支持纳秒。
- 不支持函数
localdatetime()
。
- 不支持大部分字符串时间格式,支持
YYYY-MM-DDThh:mm:ss
和YYYY-MM-DD hh:mm:ss
。
- 支持单个数字的字符串时间格式,例如
time("1:1:1")
。
DATE¶
DATE
包含日期,但是不包含时间。NebulaGraph 检索和显示DATE
的格式为YYYY-MM-DD
。支持的范围是-32768-01-01
到32767-12-31
。
date()
支持的属性名称包括year
、month
和day
。date()
支持输入YYYY
、YYYY-MM
或YYYY-MM-DD
,未输入的月份或日期默认为01
。
nebula> RETURN DATE({year:-123, month:12, day:3});
+------------------------------------+
| date({year:-(123),month:12,day:3}) |
+------------------------------------+
| -123-12-03 |
+------------------------------------+
nebula> RETURN DATE("23333");
+---------------+
| date("23333") |
+---------------+
| 23333-01-01 |
+---------------+
TIME¶
TIME
包含时间,但是不包含日期。NebulaGraph 检索和显示TIME
的格式为hh:mm:ss.msmsmsususus
。支持的范围是00:00:00.000000
到23:59:59.999999
。
time()
支持的属性名称包括hour
、minute
和second
。
DATETIME¶
DATETIME
包含日期和时间。NebulaGraph 检索和显示DATETIME
的格式为YYYY-MM-DDThh:mm:ss.msmsmsususus
。支持的范围是-32768-01-01T00:00:00.000000
到32767-12-31T23:59:59.999999
。
datetime()
支持的属性名称包括year
、month
、day
、hour
、minute
和second
。
datetime()
可将TIMESTAMP
类型的日期值转换成DATETIME
类型的日期值。TIMESTAMP
类型的日期值取值范围:0~9223372036
。
datetime()
支持int
类型的参数,该int
参数表示时间戳。
# 获取当前时间。
nebula> RETURN datetime();
+----------------------------+
| datetime() |
+----------------------------+
| 2022-08-29T06:37:08.933000 |
+----------------------------+
# 获取当前时间的小时。
nebula> RETURN datetime().hour;
+-----------------+
| datetime().hour |
+-----------------+
| 6 |
+-----------------+
# 将时间戳转换成 DATETIME 类型的格式。
nebula> RETURN datetime(timestamp(1625469277));
+---------------------------------+
| datetime(timestamp(1625469277)) |
+---------------------------------+
| 2021-07-05T07:14:37.000000 |
+---------------------------------+
nebula> RETURN datetime(1625469277);
+----------------------------+
| datetime(1625469277) |
+----------------------------+
| 2021-07-05T07:14:37.000000 |
+----------------------------+
TIMESTAMP¶
TIMESTAMP
包含日期和时间。支持的范围是 UTC 时间的1970-01-01T00:00:01
到2262-04-11T23:47:16
。
TIMESTAMP
还有以下特点:
- 以时间戳形式存储和显示。例如
1615974839
,表示2021-03-17T17:53:59
。
- 查询
TIMESTAMP
类型属性值的方式包括时间戳整数和timestamp()
函数。
- 插入
TIMESTAMP
类型属性值的方式包括时间戳整数、timestamp()
函数和now()
函数。
timestamp()
函数支持传入空值获取当前时间戳;同时支持传入整数以标识该整数为时间戳,整数取值:0~9223372036
。
timestamp()
函数可将DATETIME
类型的日期值转换成TIMESTAMP
类型的日期值,且传入的DATETIME
类型的日期值为string
类型。
- 底层存储的数据格式为 64 位 int。
# 传入当前时间。
nebula> RETURN timestamp();
+-------------+
| timestamp() |
+-------------+
| 1625469277 |
+-------------+
# 传入指定时间。
nebula> RETURN timestamp("2022-01-05T06:18:43");
+----------------------------------+
| timestamp("2022-01-05T06:18:43") |
+----------------------------------+
| 1641363523 |
+----------------------------------+
# 传入 datetime()。
nebula> RETURN timestamp(datetime("2022-08-29T07:53:10.939000"));
+---------------------------------------------------+
| timestamp(datetime("2022-08-29T07:53:10.939000")) |
+---------------------------------------------------+
| 1661759590 |
+---------------------------------------------------+
Note
传入timestamp()
函数的时间字符串不支持包含毫秒和微秒,但是通过timestamp(datetime())
传入的时间字符串支持包含毫秒和微秒。
DURATION¶
DURATION
是一段连续的时间,由years
、months
、days
、hours
、minutes
、seconds
六个Key自由组合成的Map类型数据表示。例如duration({years: 12, months: 5, days: 14, hours: 16, minutes: 12, seconds: 70})
。
DURATION
还有以下特点:
- 不支持为
DURATION
类型数据创建索引。
- 可以用于对指定时间进行计算。
示例¶
-
创建 Tag,名称为
date1
,包含DATE
、TIME
和DATETIME
三种类型。nebula> CREATE TAG IF NOT EXISTS date1(p1 date, p2 time, p3 datetime);
-
插入点,名称为
test1
。nebula> INSERT VERTEX date1(p1, p2, p3) VALUES "test1":(date("2021-03-17"), time("17:53:59"), datetime("2017-03-04T22:30:40.003000[Asia/Shanghai]"));
-
获取
test1
的属性p1
的月份。nebula> CREATE TAG INDEX IF NOT EXISTS date1_index ON date1(p1); nebula> REBUILD TAG INDEX date1_index; nebula> MATCH (v:date1) RETURN v.date1.p1.month; +------------------+ | v.date1.p1.month | +------------------+ | 3 | +------------------+
-
创建 Tag,名称为
school
,包含TIMESTAMP
类型。nebula> CREATE TAG IF NOT EXISTS school(name string , found_time timestamp);
-
插入点,名称为
DUT
,存储时间为"1988-03-01T08:00:00"
。# 时间戳形式插入,1988-03-01T08:00:00 对应的时间戳为 573177600,转换为 UTC 时间为 573206400。 nebula> INSERT VERTEX school(name, found_time) VALUES "DUT":("DUT", 573206400); # 日期和时间格式插入。 nebula> INSERT VERTEX school(name, found_time) VALUES "DUT":("DUT", timestamp("1988-03-01T08:00:00"));
-
插入点,名称为
dut
,用now()
或timestamp()
函数存储时间。# 用 now() 函数存储时间 nebula> INSERT VERTEX school(name, found_time) VALUES "dut":("dut", now()); # 用 timestamp() 函数存储时间 nebula> INSERT VERTEX school(name, found_time) VALUES "dut":("dut", timestamp());
还可以使用WITH
语句设置具体日期时间或进行计算,例如:
nebula> WITH time({hour: 12, minute: 31, second: 14, millisecond:111, microsecond: 222}) AS d RETURN d;
+-----------------+
| d |
+-----------------+
| 12:31:14.111222 |
+-----------------+
nebula> WITH date({year: 1984, month: 10, day: 11}) AS x RETURN x + 1;
+------------+
| (x+1) |
+------------+
| 1984-10-12 |
+------------+
nebula> WITH date('1984-10-11') as x, duration({years: 12, days: 14, hours: 99, minutes: 12}) as d \
RETURN x + d AS sum, x - d AS diff;
+------------+------------+
| sum | diff |
+------------+------------+
| 1996-10-29 | 1972-09-23 |
+------------+------------+