时间值

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

时间值类型

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

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

DATE

LOCAL TIME

ZONED TIME

LOCAL DATETIME

ZONED DATETIME

DURATION

-

-

-

DATELOCAL TIMEZONED TIMELOCAL DATETIMEZONED 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 值,且不指定时区。

时间瞬时

指定时间瞬时

时间瞬时由三部分组成:datetimetimezone。这些部分可以组合生成各种时间值类型。字符 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 必须是完整的;即完全标识特定的一天。

指定日期

组件 格式 描述

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

指定两位数字,从 0023

分钟

MM

指定两位数字,从 0059

SS

指定两位数字,从 0059

小数部分

sssssssss

指定从 0999999999 的数字。无需指定前导零。fractionSecond 的可选亚秒组件。这可以通过句点 (.) 或逗号 (,) 从 Second 分离。fractionSecond 的两位数字之外的部分。

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。另一方面,指定 HourSecond 而省略 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

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

根据时区的指定方式,这要么是时区名称,要么是 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 小时;在夏令时切换时,一可能有 2325 小时

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

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

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

二阶 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.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

时间索引

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


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)。
© . All rights reserved.