|| 时间值 - Cypher 手册 - Neo4j 文档

时间值

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

时间值类型

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

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

DATE

LOCAL TIME

ZONED TIME

LOCAL DATETIME

ZONED DATETIME

DURATION

-

-

-

DATE、LOCAL TIME、ZONED TIME、LOCAL DATETIME 和 ZONED DATETIME 都是时间瞬时类型。时间瞬时值表示具有不同精度的时间点。

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

从 Neo4j 5.9 开始,一些时间类型已重命名。下表显示了时间类型的当前名称和旧名称。

类型 旧类型名称

DATE

Date

LOCAL TIME

LocalTime

ZONED TIME

Time

LOCAL DATETIME

LocalDateTime

ZONED DATETIME

DateTime

DURATION

Duration

时区

时区表示为 UTC 的偏移量,或表示为命名时区的逻辑标识符(这些基于 IANA 时区数据库)。在任何一种情况下,时间在内部都以 UTC 存储,并且仅在显示时间时应用时区偏移。这意味着可以对时间瞬时进行排序而不考虑时区。但是,如果两个时间在 UTC 中相同,则它们按时区排序。

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

IANA 时区数据库中的时区规则可能会发生变化。例如,某个地区的夏令时规则可能会发生更改。如果这种情况发生在时间瞬时创建之后,则所显示的时间可能与原始输入的时间不同,就当地时区而言。但是,UTC 中的绝对时间将保持不变。

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

  • 以小时和分钟表示与 UTC 的偏移量(ISO 8601)。

  • 指定一个命名时区。

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

有关示例,请参阅指定时区。

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

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

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

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

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

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

  • 截断不带时区组件的 temporal 值,且不指定时区。

时间瞬时

指定时间瞬时

时间瞬时由三部分组成: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 必须是完整的;即完全标识特定的一天。

指定日期

组件 格式 描述

年

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 必须恰好是四位数字(年份组件被解释为公元 (CE) 年份)。

以下是指定日期支持的格式:

格式 描述 示例 示例解释

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 相同的日期。

指定时间

组件 格式 描述

小时

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。另一方面,指定 Hour 和 Second 而省略 Minute 是不可能的。

指定时区

时区可以通过以下方式之一指定:

  • 作为与 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]

Hour:Minute[ZoneName]

+08:45[Australia/Eucla]

±HHMM

小时:分钟

+0100

±HHMM[ZoneName]

Hour:Minute[ZoneName]

+0200[Africa/Johannesburg]

±HH

小时

-08

±HH[ZoneName]

Hour[ZoneName]

+08[Asia/Singapore]

[ZoneName]

[ZoneName]

[America/Regina]

时间瞬时的组件

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

时间瞬时值的组件及其支持范围
组件 描述 类型 范围/格式 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

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

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 之后的时间瞬时为正,之前的时间瞬时为负。

示例

要处理特定时间瞬时类型,必须使用其对应的函数。例如,为了创建 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 中的截断函数允许您通过将时间值截断到指定的组件(例如年、月或秒)来降低其精度。

示例 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

持续时间

指定持续时间

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 组件
组件组 组件 描述 类型 详情

月

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。

  • 1 天并非总有 24 小时;在夏令时切换时,一天可能有 23 或 25 小时。

  • 一个月并非总有相同的天数。

  • 由于闰年,一年并非总有相同的天数。

也可以访问受组件组一阶组件限制的组件组的二阶组件:

二阶 DURATION 组件
组件 组件组 描述 类型

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 个月与五个月相加。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

时间索引

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


1. 这符合格里高利历;即公元 (AD/CE) 年从 1 年开始,之前的年份(公元前 (BC/BCE) 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)。
© . This site is unofficial and not affiliated with Neo4j, Inc.