时间值

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>

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

指定日期

Component (组件) 格式 描述

年

YYYY

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

月

MM

使用从 01 到 12 的两位数字指定。

周

ww

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

季度

q

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

月中的第几天

DD

使用从 01 到 31 的两位数字指定。

周中的第几天

D

使用从 1 到 7 的一位数字指定。

季度中的第几天

DD

使用从 01 到 92 的两位数字指定。

年中的序数日

DDD

使用从 001 到 366 的三位数字指定。

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

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

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

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

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

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

如果年份组件以 - 或 + 为前缀,并与下一个组件分隔,则 Year 最多允许包含九位数字。因此,允许的年份范围在 -999,999,999 和 +999,999,999 之间。对于所有其他情况,即年份在 0000 和 9999 之间(含),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

使用从 00 到 23 的两位数字指定。

分钟

MM

使用从 00 到 59 的两位数字指定。

秒

SS

使用从 00 到 59 的两位数字指定。

分数

sssssssss

使用从 0 到 999999999 的数字指定。不需要指定前导零。fraction 是 Second 的可选次秒组件。这可以使用句点 (.) 或逗号 (,) 与 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

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

指定时区

时区按以下方式之一指定

  • 作为相对于 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(整数)

1 到 4。

instant.month

月份组件。

INTEGER(整数)

1 到 12。

instant.week

周组件。[2]

INTEGER(整数)

1 到 53。

instant.weekYear

周组件所属的年份。[3]

INTEGER(整数)

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

instant.dayOfQuarter

季度中的第几天组件。

INTEGER(整数)

1 到 92。

instant.quarterDay

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

INTEGER(整数)

1 到 92。

instant.day

月中的第几天组件。

INTEGER(整数)

1 到 31。

instant.ordinalDay

年中的第几天组件。

INTEGER(整数)

1 到 366。

instant.dayOfWeek

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

INTEGER(整数)

1 到 7。

instant.weekDay

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

INTEGER(整数)

1 到 7。

instant.hour

小时组件。

INTEGER(整数)

0 到 23。

instant.minute

分钟组件。

INTEGER(整数)

0 到 59。

instant.second

秒组件。[4]

INTEGER(整数)

0 到 59。

instant.millisecond

毫秒组件。

INTEGER(整数)

0 到 999。

instant.microsecond

微秒组件。

INTEGER(整数)

0 到 999999。

instant.nanosecond

纳秒组件。

INTEGER(整数)

0 到 999999999。

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 函数允许您通过将时间值截断到指定的组件(例如 year、month 或 second)来降低其精度。

示例 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 小时;在切换到/离开夏令时时,一天可能有 23 或 25 小时。

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

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

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

二阶 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.monthsOfYear 和 d.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.hours 和 duration.minutes 都是基于秒的组件。类似地,d.seconds、d.milliseconds、d.microseconds 和 d.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

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

© . This site is unofficial and not affiliated with Neo4j, Inc.