跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

日期和时间

日期和时间类型的值用于存储、操作和检索日期和时间信息。GQL 内置支持日期和时间类型,可以将其存储为点和边上的属性值。本文介绍日期和时间类型及其用法。

日期和时间值的分类

日期和时间值分为两类:时间点和时间段。

  • 时间点:表示特定的时间点,例如日期或时间。
  • 时间段:表示两个时间点之间的时间差。

时间点

时间点可以通过日期、时间、和时区指定。这些元素可以以各种方式组合来创建时间点。时间点类型包括时区日期时间、本地日期时间、日期、时区时间和本地时间。

  • 时区日期时间:包括时间、日期和时区。它是最具体的,因为它表示全球范围内的精确时间点。
  • 本地日期时间:包括时间和日期,但不包括时区。它表示一个时间点,但仅适用于本地,而非全球。
  • 日期:表示日历日期(年、月、日),与时区无关。
  • 时区时间:包括时间和时区。它表示在特定时区内的相同时间,但可能在不同的日期出现。
  • 本地时间:仅包含时间。这是最不具体的时间类型,只表示一天中的某个时间点,没有任何日期或时区的背景信息。

下表列出了时间点类型、声明关键字及其值范围。

类型 声明关键字 支持日期 支持时间 支持时区 取值范围
时区日期时间 ZONED DATETIME 是 是 是 -9999-01-01T00:00:00.000000+1400 ~ 9999-12-31T23:59:59.999999-1200
本地日期时间 LOCAL DATETIME 是 是 否 -9999-01-01T00:00:00.000000 ~ 9999-12-31T23:59:59.999999
日期 DATE 是 否 否 -9999-01-01 ~ 9999-12-31
时区时间 ZONED TIME 否 是 是 00:00:00.000000+1400 ~ 23:59:59.999999-1200
本地时间 LOCAL TIME 否 是 否 00:00:00.000000 ~ 23:59:59.999999
  • 声明关键字用于在创建属性时指定时间点类型。
  • 范围中展示的格式是一个示例。您可以按照自定义的格式指定时间点值。更多信息,请参见日期和时间值的格式。

时间段

时间段可以通过年、月、日、小时、分钟、秒、毫秒和微秒这些元素指定。这些元素可以以各种方式组合来创建一个时间段。时间段通过关键字DURATION来声明。时间段值可以是正数、零或负数。更多关于如何指定时间段的信息,请参见指定时间段。

日期和时间值的格式

您可以灵活定义表示这些日期和时间类型的值的格式,然而,所选格式必须遵循 ISO 8601 标准。 一旦指定了所需的格式,您应按照该格式提供时间值。

在以下示例中,%Y-%m-%dT%H:%M:%S是您定义的时间值格式,而2012-03-04T05:06:07.0890是按照该格式指定的值。

local_datetime("2012-03-04T05:06:07.0890", "%Y-%m-%dT%H:%M:%S") AS localdatetime

Note

  • 在 GQL 中,您需要使用时间函数插入时间类型的属性值。
  • 若按照默认时间值格式指定时间值,可以省略时间值格式。例如,上述示例中可以直接使用local_datetime("2012-03-04T05:06:07.0890")而不需要指定格式。

时间值格式是由以下元素组成的字符串:

元素 描述 取值范围
%Y 年 -9999 ~ 9999
%y 两位数的年份 00 ~ 99
%m 两位数的月份 01 ~ 12
%d 两位数的日期 01 ~ 31
%H 24 小时制的小时 00 ~ 23
%I 12 小时制的小时 01 ~ 12
%M 两位数的分钟 00 ~ 59
%S 两位数的秒。
包括小数秒,最多支持小数点后六位。
如果未指定小数秒,则在小数点右侧填充零。
00 ~ 59.999999
%f 小数秒 000000 ~ 999999
%a 缩写的星期名称 Mon, Tue, Wed, Thu, Fri, Sat, Sun
%A 完整的星期名称 Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
%b 缩写的月份名称 Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
%B 完整的月份名称 January, February, March, April, May, June, July, August, September, October, November, December
%z 相对于 UTC 的时区偏移。例如,-0430表示比 UTC 慢 4 小时 30 分钟。如果偏移为零,则使用+0000。 -1200 ~ +1400
%Ez 类似于%z,区别在于小时和分钟之间需要一个冒号,例如:-04:30。如果偏移为零,则使用+00:00。 -12:00 ~ +14:00

指定时间

使用%H/%I、%M、%S和%z/%Ez元素来指定时间格式,例如,05:06:07.089是以%H:%M:%S格式指定的时间。格式中必须包含%H/%I元素。

时间可以是时区时间(默认格式:%H:%M:%S %z)或本地时间(默认格式:%H:%M:%S)。如果指定了时区,则为时区时间;否则为本地时间。例如:

  • 本地时间:

    local_time("05:06:07.089", "%H:%M:%S") AS localtime
    
  • 时区时间:

    zoned_time("05:06:07.089 +08:00", "%H:%M:%S %Ez") AS zonetime
    

小数秒的尾随零可以省略。例如,05:06:07.089000可以表示为05:06:07.089。注意,如果小数秒的位数少于最大位数,将在末尾填充零以达到所需长度。

如果未指定时间元素,则时间默认为00:00:00.000000。

指定时区

时区是全球范围内在法律、商业和社会活动中使用统一标准时间的区域。它通过时区偏移来表示本地时间与世界标准时间(UTC)之间的差异。

使用%z或%Ez元素可以指定时区格式。当时区偏移与本地时间一起使用时,结果会转换为 UTC 时间。关于全球各个地区的时区标识及其偏移,请参见时区列表。

在指定 UTC 时区偏移时,请遵循以下准则:

  • 偏移应解析为四位数字,如HHMM,其中HH表示小时,MM表示分钟。小时和分钟之间可以使用冒号(:)分隔,例如+08:00。
    • 当使用%z时格式化时区时,值必须是四位数字。
    • 当使用%Ez时格式化时区时,值必须是四位数字,且小时和分钟之间必须使用冒号分隔。
  • 如果本地时间早于 UTC,偏移为正,用+号表示或无符号表示。
  • 如果本地时间晚于 UTC,偏移为负,用-号表示。
  • 如果在时区日期时间和时区时间中未指定时区的元素和对应的值,则当偏移量为零时,时区默认为+00:00。

以下示例展示了如何使用%z元素指定时区偏移。2016-09-20T01:01:01.123456是本地时间,+0800是时区偏移。返回值2016-09-20T01:01:01.123456+08:00是转换后的世界标准时间。

zoned_datetime("2016-09-20T01:01:01.123456 +0800", "%Y-%m-%dT%H:%M:%S %z") AS zoneddatetime 

指定日期

使用%Y/%y、%m/%b/%B、%d和%a/%A元素可以指定日期格式。例如,Tue, 2016-09-20是格式为%a, %Y-%m-%d的日期值。格式中必须包含%Y/%y、%m/%b/%B和%d元素。

日期的默认格式为%Y-%m-%d。如果同时指定了日期和对应的星期几,返回结果中星期几会被忽略。例如:

date("Tue, 2016-09-20", "%a, %Y-%m-%d") AS d

上述例子中,Tue, 2016-09-20T01:01:01等同于2016-09-20T01:01:01。如果日期和星期几不匹配,则会返回解析错误。

指定日期和时间

日期时间是日期和时间的组合。您可以使用日期和时间元素来指定日期时间。日期和时间元素之间需使用分隔符,如T。例如,2016-09-20T01:01:01是格式为%Y-%m-%dT%H:%M:%S的日期时间的值。格式中必须包含%Y/%y、%m/%b/%B和%d元素。

日期时间可以是带时区的日期时间(默认格式:%Y-%m-%dT%H:%M:%S %z)或本地日期时间(默认格式:%Y-%m-%dT%H:%M:%S)。如果指定了时区,则日期时间是带时区的日期时间;否则,它是本地日期时间。例如:

  • 不指定时区的日期时间:

    local_datetime("2016-09-20T01:01:01.123456", "%Y-%m-%dT%H:%M:%S") AS localdatetime
    
  • 指定时区的日期时间:

    zoned_datetime("2016-09-20T01:01:01.123456 +08:00", "%Y-%m-%dT%H:%M:%S %Ez") AS zoneddatetime
    

指定时间段

指定时间段格式时,支持使用以下时间段单位组:

  • 基于年和月的时间段单位组:years和months,例如duration({years: 100, months: 1})。
  • 基于天和时间的时间段单位组:days、hours、minutes、seconds、milliseconds和microseconds,例如duration({days: 1, hours: 2, minutes: 3, seconds: 4, milliseconds: 4, microseconds: 5})。

对于每个单位组,单位值以映射的形式指定。单位值可以是正整数、零或负整数。可以通过多种方式组合单位值来创建时间段。映射中的单位是可选的。如果未指定单位,则该值默认为零。有关指定时间段的示例,请参见时间函数 duration()。

日期和时间值的运算

支持使用以下运算符或函数对日期和时间值进行运算。运算示例,请参见时间点和时间段之间的运算。

运算对象 1 函数/运算符 运算对象 2 结果
时间点 duration_between() 时间点 时间段
时间点 +或者- 时间段 时间点
时间段 + 时间点 时间点
时间段 +或者- 时间段 时间段
时间段 *或者/ 数字 时间段
数字 * 时间段 时间段

时间点的组成部分

时间点支持通过点号(.)运算符来访问其组成部分。下表列出了支持的组成部分并提供了访问示例。

组成部分 描述 日期和时间函数示例 日期和时间字面量示例
year 时间点的年份 RETURN zoned_datetime("2016-09-20T01:01:01 +08:00", "%Y-%m-%dT%H:%M:%S %Ez").year AS year RETURN DATETIME "2016-09-20T01:01:01+0800".year AS year
month 时间点的月份 RETURN date("Tue, 2016-09-20", "%a, %Y-%m-%d").month AS month RETURN DATE "2016-09-20".month AS month
day 时间点的日期 RETURN local_datetime("2016-09-20T01:01:01", "%Y-%m-%dT%H:%M:%S").day AS day RETURN DATETIME "2016-09-20T01:01:01".day AS day
hour 时间点的小时数 RETURN zoned_time("05:06:07.089 +08:00", "%H:%M:%S %Ez").hour AS hour RETURN TIME "05:06:07.089+0800".hour AS hour
minute 时间点的分钟数 RETURN zoned_time("05:06:07.089 +08:00", "%H:%M:%S %Ez").minute AS minute RETURN TIME "05:06:07.089+0800".minute AS minute
second 时间点的秒数 RETURN local_time("05:06:07.089", "%H:%M:%S").second AS second RETURN TIME "05:06:07.089".second AS second

当访问时间点中不包含的组成部分时,遵循以下规则:

  • 当访问时区时间(ZONED TIME)或本地时间(LOCAL TIME)的year、month或day时,返回当前日期的相应值。
  • 当访问日期(DATE)的hour、minute或second时,返回值统一为0。

更多信息