时间值

Cypher® 内置支持处理时间值,这些值可以作为属性存储在 Neo4j 数据库的节点和关系中。本节将讨论 Cypher 如何处理时区,并进一步详细探讨时间值。

时间值类型

下表列出了时间值类型及其支持的组件

类型 日期支持 时间支持 时区支持

DATE

LOCAL TIME

ZONED TIME

LOCAL DATETIME

ZONED DATETIME

DURATION(持续时间)

-

-

-

DATE(日期)、LOCAL TIME(本地时间)、ZONED TIME(带时区时间)、LOCAL DATETIME(本地日期时间)和 ZONED DATETIME(带时区日期时间)是时间即时 (temporal instant) 类型。时间即时值以不同的精度表示时间点。

相比之下,DURATION 不是时间即时类型。DURATION 表示一个时间量,捕获两个即时点之间的时间差,并且可以是负数。DURATION 捕获两个即时点之间的时间量,它不捕获开始时间和结束时间。

时区

时区表示为 UTC 的偏移量,或表示为命名时区的逻辑标识符(这些标识符基于 IANA 时区数据库)。无论哪种情况,时间在内部都存储为 UTC,时区偏移量仅在呈现时间时应用。这意味着时间即时点可以在不考虑时区的情况下进行排序。但是,如果两个时间在 UTC 下相同,则它们会按时区排序。

使用命名时区创建时间时,UTC 的偏移量是根据时区数据库中的规则计算得出的,以创建 UTC 时间即时点,并确保命名时区有效。

IANA 时区数据库中的时区规则可能会发生变化。例如,特定区域的夏令时规则可能会发生改变。如果这种情况发生在创建时间即时点之后,则就本地时区而言,显示的时间可能与最初输入的时间不同。但是,UTC 的绝对时间保持不变。

在 Cypher 中指定时区有三种方法

  • 指定 UTC 的小时和分钟偏移量 (ISO 8601)。

  • 指定命名时区。

  • 同时指定偏移量和时区名称(要求两者匹配)。

有关示例,请参见 指定时区

命名时区形式使用 IANA 时区数据库的规则来管理夏令时 (DST)。

数据库的默认时区可以使用配置选项 db.temporal.timezone 进行配置。此配置选项会影响以下函数的时间类型的创建

  • 获取当前日期和时间而不指定时区。

  • 从组件创建时间类型而不指定时区。

  • 通过解析 STRING 创建时间类型而不指定时区。

  • 通过组合或选择没有时区组件的值来创建时间类型,且不指定时区。

  • 截断没有时区组件的时间值,且不指定时区。

时间即时点

指定时间即时点

时间即时点由三部分组成:date(日期)、time(时间)和 timezone(时区)。这些部分可以组合生成各种时间值类型。字符 T 是字面字符。

时间即时类型 组件构成

DATE

<date>

LOCAL TIME

<time>T<time>

ZONED TIME

<time><timezone>T<time><timezone>

LOCAL DATETIME*

<date>T<time>

ZONED DATETIME*

<date>T<time><timezone>

*当组合 datetime 时,date 必须完整;即完全确定特定的某一天。

指定日期

Component (组件) 格式 描述

YYYY

至少使用四位数字指定(在某些情况下适用特殊规则)。

MM

使用从 0112 的两位数字指定。

ww

始终以 W 为前缀,并使用从 0153 的两位数字指定。

季度

q

始终以 Q 为前缀,并使用从 14 的一位数字指定。

月中的第几天

DD

使用从 0131 的两位数字指定。

周中的第几天

D

使用从 17 的一位数字指定。

季度中的第几天

DD

使用从 0192 的两位数字指定。

年中的序数日

DDD

使用从 001366 的三位数字指定。

如果年份在 0000 之前或 9999 之后,则适用以下附加规则

  • 任何 0000 之前的年份必须以减号 - 为前缀(例如 -3000-01-01)。

  • 任何 9999 之后的年份必须以加号 + 为前缀(例如 +11000-01-01)。

  • 年份必须使用 - 与下一个组件分隔

    • 如果下一个组件是月份(例如 +11000-01)。

    • 如果下一个组件是年中的第几天(例如 +11000-123)。

如果年份组件以 -+ 为前缀,并与下一个组件分隔,则 Year 最多允许包含九位数字。因此,允许的年份范围在 -999,999,999 和 +999,999,999 之间。对于所有其他情况,即年份在 00009999 之间(含),Year 必须恰好包含四位数字(年份组件被解释为公元纪年)。

指定日期支持以下格式

格式 描述 示例 示例解释

YYYY-MM-DD

日历日期:年-月-日

2015-07-21

2015-07-21

YYYYMMDD

日历日期:年-月-日

20150721

2015-07-21

YYYY-MM

日历日期:年-月

2015-07

2015-07-01

YYYYMM

日历日期:年-月

201507

2015-07-01

YYYY-Www-D

周日期:年-周-日

2015-W30-2

2015-07-21

YYYYWwwD

周日期:年-周-日

2015W302

2015-07-21

YYYY-Www

周日期:年-周

2015-W30

2015-07-20

YYYYWww

周日期:年-周

2015W30

2015-07-20

YYYY-Qq-DD

季度日期:年-季度-日

2015-Q2-60

2015-05-30

YYYYQqDD

季度日期:年-季度-日

2015Q260

2015-05-30

YYYY-Qq

季度日期:年-季度

2015-Q2

2015-04-01

YYYYQq

季度日期:年-季度

2015Q2

2015-04-01

YYYY-DDD

序数日期:年-日

2015-202

2015-07-21

YYYYDDD

序数日期:年-日

2015202

2015-07-21

YYYY

2015

2015-01-01

可以省略最小的组件。Cypher 将假设省略的组件具有其可能的最小值。例如,2013-06 将被解释为与 2013-06-01 相同的日期。

指定时间

Component (组件) 格式 描述

小时

HH

使用从 0023 的两位数字指定。

分钟

MM

使用从 0059 的两位数字指定。

SS

使用从 0059 的两位数字指定。

分数

sssssssss

使用从 0999999999 的数字指定。不需要指定前导零。fractionSecond 的可选次秒组件。这可以使用句点 (.) 或逗号 (,) 与 Second 分隔。fraction 是在 Second 的两位数字之外的附加部分。

Cypher 不支持闰秒;UTC-SLS平滑闰秒的 UTC)用于管理 UTC 和 TAI(国际原子时)之间的时间差。

指定时间支持以下格式

格式 描述 示例 示例解释

HH:MM:SS.sssssssss

小时:分钟:秒.分数

21:40:32.142

21:40:32.142

HHMMSS.sssssssss

小时:分钟:秒.分数

214032.142

21:40:32.142

HH:MM:SS

小时:分钟:秒

21:40:32

21:40:32.000

HHMMSS

小时:分钟:秒

214032

21:40:32.000

HH:MM

小时:分钟

21:40

21:40:00.000

HHMM

小时:分钟

2140

21:40:00.000

HH

小时

21

21:00:00.000

可以省略最小的组件。例如,时间可以使用 HourMinute 指定,省略 Secondfraction。另一方面,不能在省略 Minute 的情况下使用 HourSecond 指定时间。

指定时区

时区按以下方式之一指定

  • 作为相对于 UTC 的偏移量。

  • 使用 Z 缩写表示 UTC (±00:00) 时区。

当将时区指定为相对于 UTC 的偏移量时,适用以下规则

  • 时区始终以加号 (+) 或减号 (-) 开头。

    • 正偏移量,即以 + 开头的时区,表示 UTC 以东的时区。

    • 负偏移量,即以 - 开头的时区,表示 UTC 以西的时区。

  • 两位小时偏移量跟在 +/- 符号后面。

  • 可选的两位分钟偏移量跟在小时偏移量后面,可选地使用冒号 (:) 分隔。

  • 国际日期变更线的时区根据国家/地区表示为 +12:00-12:00

创建 ZONED DATETIME 时间即时类型的值时,也可以使用 IANA 时区数据库中的名称来指定命名时区。这可以作为偏移量的补充或替代。命名时区位于最后并用方括号 ([]) 括起来。如果同时提供了偏移量和命名时区,则偏移量必须与命名时区匹配。

指定时区支持以下格式

格式 描述 示例 ZONED DATETIME 支持 ZONED TIME 支持

Z

UTC

Z

±HH:MM

小时:分钟

+09:30

±HH:MM[ZoneName]

小时:分钟[ZoneName]

+08:45[Australia/Eucla]

±HHMM

小时:分钟

+0100

±HHMM[ZoneName]

小时:分钟[ZoneName]

+0200[Africa/Johannesburg]

±HH

小时

-08

±HH[ZoneName]

小时[ZoneName]

+08[Asia/Singapore]

[ZoneName]

[ZoneName]

[America/Regina]

时间即时点的组件

时间即时点值的组件可以作为属性访问。

时间即时点值的组件及其支持范围
Component (组件) 描述 类型 范围/格式 DATE ZONED DATETIME LOCAL DATETIME ZONED TIME LOCAL TIME

instant.year

year 组件表示即时点的天文年号[1]

INTEGER(整数)

至少 4 位数字。有关详细信息,请参阅使用 Year 组件的规则

instant.quarter

季度组件。

INTEGER(整数)

14

instant.month

月份组件。

INTEGER(整数)

112

instant.week

组件。[2]

INTEGER(整数)

153

instant.weekYear

组件所属的年份[3]

INTEGER(整数)

至少 4 位数字。有关详细信息,请参阅使用 Year 组件的规则

instant.dayOfQuarter

季度中的第几天组件。

INTEGER(整数)

192

instant.quarterDay

季度中的第几天组件(instant.dayOfQuarter 的别名)。

INTEGER(整数)

192

instant.day

月中的第几天组件。

INTEGER(整数)

131

instant.ordinalDay

年中的第几天组件。

INTEGER(整数)

1366

instant.dayOfWeek

周中的第几天组件(一周的第一天是星期一)。

INTEGER(整数)

17

instant.weekDay

周中的第几天组件(instant.dayOfWeek 的别名)。

INTEGER(整数)

17

instant.hour

小时组件。

INTEGER(整数)

023

instant.minute

分钟组件。

INTEGER(整数)

059

instant.second

组件。[4]

INTEGER(整数)

059

instant.millisecond

毫秒组件。

INTEGER(整数)

0999

instant.microsecond

微秒组件。

INTEGER(整数)

0999999

instant.nanosecond

纳秒组件。

INTEGER(整数)

0999999999

instant.timezone

时区组件。

STRING

根据时区的指定方式,这要么是时区名称,要么是格式为 ±HHMM 的 UTC 偏移量。

instant.offset

时区偏移量。

STRING

格式为 ±HHMM

instant.offsetMinutes

以分钟为单位的时区偏移量。

INTEGER(整数)

-1080+1080

instant.offsetSeconds

以秒为单位的时区偏移量。

INTEGER(整数)

-64800+64800

instant.epochMillis

1970-01-01T00:00:00+0000 与该即时点之间的毫秒数。[5]

INTEGER(整数)

对于 1970-01-01T00:00:00+0000 之后的即时点为正值,之前的即时点为负值。

instant.epochSeconds

1970-01-01T00:00:00+0000 与该即时点之间的秒数。[6]

INTEGER(整数)

对于 1970-01-01T00:00:00+0000 之后的即时点为正值,之前的即时点为负值。

1. 这符合格里高利历;即公元/公元年从 1 年开始,前一年(公元前 1 年)是 0,而公元前 2 年是 -1,以此类推。
2. 每年的第一周是包含该年第一个星期四的那一周,因此始终包含 1 月 4 日。
3. 对于 12 月 29 日起的日期,这可能是下一年;对于 1 月 3 日之前的日期,这可能是上一年,具体取决于第 1 周的开始方式。
4. Cypher 不支持闰秒;UTC-SLS(平滑闰秒的 UTC)用于管理 UTC 和 TAI(国际原子时)之间的时间差。
5. 表达式 datetime().epochMillis 返回与 timestamp() 函数等效的值。
6. 对于纪元偏移量的纳秒部分,可以使用常规的纳秒组件 (instant.nanosecond)。

示例

要使用特定的时间即时点类型,必须使用其对应的函数。例如,要创建类型为 ZONED DATETIME 的属性值,必须使用 datetime() 函数。

有关具体示例,请参阅

DATE

要使用 DATE 值(包括创建、解析和提取组件),请使用 date() 函数。

示例 1. DATE
创建一个 DATE 属性值
CREATE (n:Label)
SET n.date = date("2025-02-18")
RETURN n.date AS date, valueType(n.date) AS temporalValueType
结果
date temporalValueType

2025-02-18

"DATE NOT NULL"

行:1

使用组件创建一个 DATE 属性值
CREATE (n:Label)
SET n.date = date({year: 2025, month: 2, day: 18})
RETURN n.date AS date, valueType(n.date) AS temporalValueType
结果
date temporalValueType

2025-02-18

"DATE NOT NULL"

行:1

使用周日期格式解析 DATE
RETURN date('+2015-W13-4') AS theDate
结果
theDate

2015-03-26

行:1

获取 DATE 值的组件
WITH date({year: 1984, month: 10, day: 11}) AS d
RETURN d.year, d.quarter, d.month, d.week, d.weekYear, d.day, d.ordinalDay, d.dayOfWeek, d.dayOfQuarter
结果
d.year d.quarter d.month d.week d.weekYear d.day d.ordinalDay d.dayOfWeek d.dayOfQuarter

1984

4

10

41

1984

11

285

4

11

行:1

LOCAL TIME

要使用 LOCAL TIME 值(包括创建、解析和提取组件),请使用 localtime() 函数。

示例 2. LOCAL TIME
创建一个 LOCAL TIME 属性值
CREATE (n:Label)
SET n.localTime = localtime("12:34:56.789")
RETURN n.localTime AS localTime, valueType(n.localTime) AS temporalValueType
结果
localTime temporalValueType

12:34:56.789

"LOCAL TIME NOT NULL"

行:1

使用组件创建一个 LOCAL TIME 属性值
CREATE (n:Label)
SET n.localTime = localtime({hour: 12, minute: 34, second: 56, millisecond: 789})
RETURN n.localTime AS localTime, valueType(n.localTime) AS temporalValueType
结果
localTime temporalValueType

12:34:56.789

"LOCAL TIME NOT NULL"

行:1

获取 LOCAL TIME 值的组件
WITH localtime({hour: 12, minute: 34, second: 56, millisecond: 789}) AS t
RETURN t.hour, t.minute, t.second, t.millisecond
结果
t.hour t.minute t.second t.millisecond

12

34

56

789

行:1

ZONED TIME

要使用 ZONED TIME 值(包括创建、解析和提取组件),请使用 time() 函数。

示例 3. ZONED TIME
创建一个带偏移量的 ZONED TIME 属性值
CREATE (n:Label)
SET n.zonedTime = time("12:34:56.789+02:00")
RETURN n.zonedTime AS zonedTime, valueType(n.zonedTime) AS temporalValueType
结果
zonedTime temporalValueType

12:34:56.789+02:00

"ZONED TIME NOT NULL"

行:1

使用组件和时区创建一个 ZONED TIME 属性值
CREATE (n:Label)
SET n.zonedTime = time({hour: 12, minute: 34, second: 56, millisecond: 789, timezone: 'Europe/Stockholm'})
RETURN n.zonedTime AS zonedTime, valueType(n.zonedTime) AS temporalValueType
结果
time temporalValueType

12:34:56.789+01:00

"ZONED TIME NOT NULL"

行:1

获取 ZONED TIME 值的组件
WITH time("12:34:56.789+02:00") AS t
RETURN t.hour, t.minute, t.second, t.millisecond, t.offset
结果
t.hour t.minute t.second t.millisecond t.offset

12

34

56

789

"+02:00"

行:1

LOCAL DATETIME

要使用 LOCAL DATETIME 值(包括创建、解析和提取组件),请使用 localdatetime() 函数。

示例 4. LOCAL DATETIME
使用序数日期格式创建一个 LOCAL DATETIME 属性值
CREATE (n:Label)
SET n.localDateTime = localdatetime("2025-02-18T12:34:56")
RETURN n.localDateTime AS localDateTime, valueType(n.localDateTime) AS temporalValueType
结果
localDateTime temporalValueType

2025-02-18T12:34:56

"LOCAL DATETIME NOT NULL"

行:1

使用时间组件创建一个 LOCAL DATETIME 属性值
CREATE (n:Label)
SET n.localDateTime = localdatetime({year: 2025, month: 2, day: 18, hour: 12, minute: 34, second: 56, millisecond: 789})
RETURN n.localDateTime AS localDateTime, valueType(n.localDateTime) AS temporalValueType
结果
localDatetime temporalValueType

2025-02-18T12:34:56.789

"LOCAL DATETIME NOT NULL"

行:1

使用序数日期格式解析 LOCAL DATETIME
RETURN localdatetime('2015185T19:32:24') AS theLocalDateTime
结果
theLocalDateTime

2015-07-04T19:32:24

行:1

获取 LOCAL DATETIME 值的组件
WITH localdatetime({year: 2025, month: 2, day: 19, hour: 12, minute: 34, second: 56, millisecond: 789}) AS t
RETURN t.year, t.month, t.day, t.hour, t.minute, t.second, t.millisecond
结果
t.year t.month t.day t.hour t.minute t.second t.millisecond

2025

2

19

12

34

56

789

行:1

ZONED DATETIME

要使用 ZONED DATETIME 值(包括创建、解析和提取组件),请使用 datetime() 函数。

示例 5. ZONED DATETIME
使用日历日期格式创建一个 ZONED DATETIME 属性值
CREATE (n:Label)
SET n.zonedDateTime = datetime("2025-02-18T12:34:56.789+02:00")
RETURN n.zonedDateTime AS zonedDateTime, valueType(n.zonedDateTime) AS temporalValueType
结果
zonedDateTime temporalValueType

2025-02-18T12:34:56.789+02:00

"ZONED DATETIME NOT NULL"

行:1

使用时间组件创建一个 ZONED DATETIME 属性值
CREATE (n:Label)
SET n.zonedDateTime = datetime({year: 2025, month: 2, day: 18, hour: 12, minute: 34, second: 56, millisecond: 789, timezone: 'Europe/Stockholm'})
RETURN n.zonedDateTime, valueType(n.zonedDateTime) AS temporalValueType
结果
zonedDateTime temporalValueType

2025-02-18T12:34:56.789+01:00[Europe/Stockholm]

"ZONED DATETIME NOT NULL"

行:1

使用时区创建一个 ZONED DATETIME 属性值
CREATE (n:Label)
SET n.zonedDateTime = datetime({timezone: 'Europe/Stockholm'})
RETURN n.zonedDateTime AS zonedDateTime, valueType(n.zonedDateTime) AS temporalValueType
结果
zonedDateTime temporalValueType

2025-02-18T15:22:48.227+01:00[Europe/Stockholm]

"ZONED DATETIME NOT NULL"

行:1

使用日历日期格式解析 ZONED DATETIME
RETURN datetime('2015-06-24T12:50:35.556+0100') AS theDateTime
结果
theDateTime

2015-06-24T12:50:35.556+01:00

行:1

获取 ZONED DATETIME 值的日期相关组件
WITH datetime({
  year: 1984, month: 11, day: 11,
  hour: 12, minute: 31, second: 14, nanosecond: 645876123,
  timezone: 'Europe/Stockholm'
}) AS d
RETURN d.year, d.quarter, d.month, d.week, d.weekYear, d.day, d.ordinalDay, d.dayOfWeek, d.dayOfQuarter
结果
d.year d.quarter d.month d.week d.weekYear d.day d.ordinalDay d.dayOfWeek d.dayOfQuarter

1984

4

11

45

1984

11

316

7

42

行:1

获取 ZONED DATETIME 值的时间相关组件
WITH datetime({
  year: 1984, month: 11, day: 11,
  hour: 12, minute: 31, second: 14, nanosecond: 645876123,
  timezone: 'Europe/Stockholm'
}) AS d
RETURN d.hour, d.minute, d.second, d.millisecond, d.microsecond, d.nanosecond
结果
d.hour d.minute d.second d.millisecond d.microsecond d.nanosecond

12

31

14

645

645876

645876123

行:1

获取 ZONED DATETIME 值的纪元时间和时区相关组件
WITH datetime({
  year: 1984, month: 11, day: 11,
  hour: 12, minute: 31, second: 14, nanosecond: 645876123,
  timezone: 'Europe/Stockholm'
}) AS d
RETURN d.timezone, d.offset, d.offsetMinutes, d.epochSeconds, d.epochMillis
结果
d.timezone d.offset d.offsetMinutes d.epochSeconds d.epochMillis

"Europe/Stockholm"

"+01:00"

60

469020674

469020674645

行:1

截断时间值

Neo4j 中的 truncate 函数允许您通过将时间值截断到指定的组件(例如 yearmonthsecond)来降低其精度。

示例 6. 截断 DATE

要截断 DATE 值,请使用 date.truncate() 函数。

获取当前年度的第一天
RETURN date.truncate('year') AS firstDay
结果
firstDay

2022-01-01

行:1

获取特定日期所在周的星期四的日期
RETURN date.truncate('week', date('2019-10-01'), {dayOfWeek: 4}) AS thursday
结果
thursday

2019-10-03

行:1

示例 7. 截断 LOCAL TIME

要截断 LOCAL TIME 值,请使用 localtime.truncate() 函数。

获取特定 LOCAL TIME 值的当前分钟开始时间
RETURN localtime.truncate('minute', localtime("12:34:56.789")) AS truncatedMinute
结果
truncatedMinute

12:34

行:1

使用系统 LOCAL TIME 获取当前秒的开始时间
RETURN localtime.truncate('second') AS currentSecond
结果
currentSecond

10:12:28

行:1

示例 8. 截断 ZONED TIME

要截断 ZONED TIME 值,请使用 time.truncate() 函数。

获取特定 ZONED TIME 值的当前分钟开始时间
RETURN time.truncate('minute', time("12:34:56.789+02:00")) AS truncatedMinute
结果
truncatedMinute

12:34+02:00

行:1

获取截断到最接近分钟的当前 ZONED TIME
RETURN time.truncate('minute', time()) AS currentTime
结果
truncatedTime

10:20Z

行:1

示例 9. 截断 LOCAL DATETIME

要截断 LOCAL DATETIME 值,请使用 localdatetime.truncate() 函数。

获取特定 LOCAL DATETIME 的小时开始时间
RETURN localdatetime.truncate('hour', localdatetime("2025-02-18T12:34:56.789")) AS truncatedHour
结果
truncatedHour

2025-02-18T12:00

行:1

获取 LOCAL DATETIME 中当前月份的开始时间
RETURN localdatetime.truncate('month') AS truncatedMonth
结果
truncatedMonth

2025-02-01T00:00

行:1

示例 10. 截断 ZONED DATETIME

要截断 ZONED DATETIME 值,请使用 datetime.truncate() 函数。

获取特定 ZONED DATETIME 的分钟开始时间
RETURN datetime.truncate('minute', datetime("2025-02-18T12:34:56.789+02:00")) AS truncatedZonedDateTime
结果
truncatedZonedDateTime

2025-02-18T12:34+02:00

行:1

获取 ZONED DATETIME 中当前周的星期三开始时间
RETURN datetime.truncate('week', datetime(), {dayOfWeek: 3}) AS startOfWednesday
结果
startOfWednesday

2025-02-19T00:00Z

行:1

持续时间 (Durations)

指定持续时间

DURATION 表示一个时间量,捕获两个即时点之间的时间差,并且可以是负数。

DURATION 的指定以 P 为前缀,可以使用基于单位的形式基于日期和时间的形式

  • 基于单位的形式: P[nY][nM][nW][nD][T[nH][nM][nS]]

    • 方括号 ([]) 表示可选组件(值可为零的组件可以省略)。

    • n 表示在 64 位整数范围内的数值。

    • 最后一个(也是最小的)组件的值可以包含十进制分数。

    • 每个组件必须带有表示单位的组件标识符作为后缀。

    • 基于单位的形式使用 M 作为月份和分钟的后缀。因此,时间部分必须始终以 T 为前缀,即使日期部分没有提供组件也是如此。

    • 持续时间的最大总长度受 64 位整数可以容纳的秒数限制。

  • 基于日期和时间的形式: P<date>T<time>

    • 与基于单位的形式不同,此形式要求每个组件都在有效的 LOCAL DATETIME 范围内。

下表列出了基于单位形式的组件标识符

组件标识符 描述 注释

Y

M

必须在 T 之前指定。

W

D

H

小时

M

分钟

必须在 T 之后指定。

S

持续时间的组件

DURATION 可以有多个组件,每个组件归类为组。

DURATION 值的组件在其组件组内截断如下

一阶 DURATION 组件
组件组 Component (组件) 描述 类型 详细信息

duration.years

的总数。

INTEGER(整数)

每组 4季度算作 1 ;每组 12算作 1

duration.quarters

季度的总数。

INTEGER(整数)

算作 4 季度;每组 3算作 1 季度

duration.months

的总数。

INTEGER(整数)

算作 12 ;每个 季度 算作 3

duration.weeks

的总数。

INTEGER(整数)

每组 7 天算作 1

duration.days

的总数。

INTEGER(整数)

算作 7

duration.hours

小时的总数。

INTEGER(整数)

每组 60 分钟算作 1 小时;每组 3600 算作 1 小时

duration.minutes

分钟的总数。

INTEGER(整数)

小时 算作 60 分钟;每组 60 算作 1 分钟

duration.seconds

的总数。

INTEGER(整数)

小时 算作 3600 ;每 分钟 算作 60

duration.milliseconds

毫秒的总数。

INTEGER(整数)

每组 1000 毫秒算作 1

duration.microseconds

微秒的总数。

INTEGER(整数)

毫秒 算作 1000 微秒

duration.nanoseconds

纳秒的总数。

INTEGER(整数)

微秒 算作 1000 纳秒

请注意

  • Cypher 在处理闰秒时使用 UTC-SLS

  • 并非每天都有 24 小时;在切换到/离开夏令时时,一天可能有 2325 小时

  • 并非每个的天数都相同。

  • 由于闰年,并非每年的天数都相同。

还可以访问受该组一阶组件限制的组件组的二阶组件

二阶 DURATION 组件
Component (组件) 组件组 描述 类型

duration.quartersOfYear

组中不足一整季度数。

INTEGER(整数)

duration.monthsOfYear

组中不足一整月份数。

INTEGER(整数)

duration.monthsOfQuarter

组中不足一整季度月份数。

INTEGER(整数)

duration.daysOfWeek

组中不足一整天数

INTEGER(整数)

duration.minutesOfHour

组中不足一整小时分钟数

INTEGER(整数)

duration.secondsOfMinute

组中不足一整分钟秒数

INTEGER(整数)

duration.millisecondsOfSecond

组中不足一整毫秒数

INTEGER(整数)

duration.microsecondsOfSecond

组中不足一整微秒数

INTEGER(整数)

duration.nanosecondsOfSecond

组中不足一整纳秒数

INTEGER(整数)

示例

以下是使用 duration() 函数解析持续时间的示例。更多信息可以在 此处 找到。

示例 11. 返回 14 16 小时12 分钟的持续时间
查询
RETURN duration('P14DT16H12M') AS theDuration
结果
theDuration

P14DT16H12M

行:1

示例 12. 返回 5 1 12 小时的持续时间
查询
RETURN duration('P5M1.5D') AS theDuration
结果
theDuration

P5M1DT12H

行:1

示例 13. 返回 45 秒的持续时间
查询
RETURN duration('PT0.75M') AS theDuration
结果
theDuration

PT45S

行:1

示例 14. 返回 2 3 12 小时的持续时间
查询
RETURN duration('P2.5W') AS theDuration
结果
theDuration

P17DT12H

行:1

示例 15. 获取 DURATION 值的月相关组件
查询
WITH duration({years: 1, months: 5, days: 111, minutes: 42}) AS d
RETURN d.years, d.quarters, d.quartersOfYear, d.months, d.monthsOfYear, d.monthsOfQuarter
结果
d.years d.quarters d.quartersOfYear d.months d.monthsOfYear d.monthsOfQuarter

1

5

1

17

5

2

行:1

d.quarters 的值为 5,因为该持续时间的一年有四个季度,而五个月中还有一个季度。 d.months 的值为 17,因为它将持续时间一年的 12 个月与 5 个月相加。 d.quartersOfYear 是剩余的季度,计入下一个完整年度。类似地,d.monthsOfYeard.monthsOfQuarter 分别计入下一个完整年度和季度。请参阅 持续时间的组件 中的一阶 DURATION 组件二阶 DURATION 组件表格。

示例 16. 获取 DURATION 值的日相关组件
查询
WITH duration({months: 5, days: 25, hours: 1}) AS d
RETURN d.weeks, d.days, d.daysOfWeek
结果
d.weeks d.days d.daysOfWeek

3

25

4

行:1

d.weeks 的值为 3,因为查询中的 25 天是三个整周(或 21 天)。 d.daysOfWeek 是剩余的天数,计入下一个完整周。请参阅 持续时间的组件 中的一阶 DURATION 组件二阶 DURATION 组件表格。

示例 17. 获取 DURATION 值的一阶秒相关组件
查询
WITH duration({
  years: 1, months:1, days:1, hours: 1,
  minutes: 1, seconds: 1, nanoseconds: 111111111
}) AS d
RETURN d.hours, d.minutes, d.seconds, d.milliseconds, d.microseconds, d.nanoseconds
结果
d.hours d.minutes d.seconds d.milliseconds d.microseconds d.nanoseconds

1

61

3661

3661111

3661111111

3661111111111

行:1

d.minutes 是小时的 60 分钟与查询中 1 分钟的总和,因为 duration.hoursduration.minutes 都是基于秒的组件。类似地,d.secondsd.millisecondsd.microsecondsd.nanoseconds 是查询中相关基于秒的组件的总和值。

d.hours 不考虑查询中的天数,因为 duration.days 是基于天的组件。

请参阅 持续时间的组件 中的一阶 DURATION 组件表格。

示例 18. 获取 DURATION 值的二阶秒相关组件
查询
WITH duration({
  years: 1, months:1, days:1,
  hours: 1, minutes: 1, seconds: 1, nanoseconds: 111111111
}) AS d
RETURN d.minutesOfHour, d.secondsOfMinute, d.millisecondsOfSecond, d.microsecondsOfSecond, d.nanosecondsOfSecond
结果
d.minutesOfHour d.secondsOfMinute d.millisecondsOfSecond d.microsecondsOfSecond d.nanosecondsOfSecond

1

1

111

111111

111111111

行:1

返回的值分别计入下一个完整小时、分钟或秒。例如,d.microsecondsOfSecond 的值为 111111,因为它是查询中的 111111111 纳秒以微秒计(向下取整),但不足一整秒。

请参阅 持续时间的组件 中的二阶 DURATION 组件表格。

示例 19. 创建表示 1.5 的持续时间
查询
RETURN duration({days: 1, hours: 12}) AS theDuration
结果
theDuration

P1DT12H

行:1

示例 20. 计算两个时间即时点之间的 DURATION
查询
RETURN duration.between(date('1984-10-11'), date('2015-06-24')) AS theDuration
结果
theDuration

P30Y8M13D

行:1

示例 21. 计算两个 DATE 值之间的天数
查询
RETURN duration.inDays(date('2014-10-11'), date('2015-08-06')) AS theDuration
结果
theDuration

P299D

行:1

示例 22. 获取下个月最后一天的 DATE
查询
RETURN date.truncate('month', date() + duration('P2M')) - duration('P1D') AS lastDay
结果
lastDay

2022-07-31

行:1

示例 23. 将 DURATION 添加到 DATE
查询
RETURN time('13:42:19') + duration({days: 1, hours: 12}) AS theTime
结果
theTime

01:42:19.000000000+00:00

行:1

示例 24. 添加两个 DURATION
查询
RETURN duration({days: 2, hours: 7}) + duration({months: 1, hours: 18}) AS theDuration
结果
theDuration

P1M2DT25H

行:1

示例 25. 将 DURATION 乘以一个数字
查询
RETURN duration({hours: 5, minutes: 21}) * 14 AS theDuration
结果
theDuration

PT74H54M

行:1

示例 26. 将 DURATION 除以一个数字
查询
RETURN duration({hours: 3, minutes: 16}) / 2 AS theDuration
结果
theDuration

PT1H38M

行:1

示例 27. 检查两个即时点是否相隔不到一天
查询
WITH
  datetime('2015-07-21T21:40:32.142+0100') AS date1,
  datetime('2015-07-21T17:12:56.333+0100') AS date2
RETURN
CASE
  WHEN date1 < date2 THEN date1 + duration("P1D") > date2
  ELSE date2 + duration("P1D") > date1
END AS lessThanOneDayApart
结果
lessThanOneDayApart

true

行:1

示例 28. 返回当前月份的缩写名称
查询
RETURN ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][date().month-1] AS month
结果
month

"Jun"

行:1

时间索引

所有时间类型都可以被索引,从而支持相等谓词的精确查找。时间即时点类型的索引还支持范围查找。

格式化时间值

使用 Cypher 的 format(),您可以创建时间即时点和持续时间类型的动态格式化字符串表示。

示例 29. 即时类型的字符串表示
查询
WITH datetime('1986-11-18T6:04:45.123456789+01:00[Europe/Berlin]') AS dt
RETURN format(dt, "MM/dd/yyyy") AS US, format(dt, "dd/MM/yyyy") AS EU
结果
US EU

"11/18/1986"

"18/11/1986"

行:1

示例 30. 持续时间类型的字符串表示
查询
WITH duration({years: 1, months: 4, weeks: 3, days: 4, hours: 5, minutes: 6, seconds: 7, milliseconds: 8,  microseconds: 9, nanoseconds: 10}) AS d
RETURN format(d, "y 'years' q 'quarters' M 'months' w 'weeks' d 'days' h 'hours' m 'minutes' s 'seconds' N 'nanos'") AS x
结果
x

"1 years 1 quarters 1 months 3 weeks 4 days 5 hours 6 minutes 7 seconds 8009010 nanos"

行:1

有关如何构建字符串模式的更多示例和详细信息,请参阅 即时类型持续时间类型