时间值
Cypher® 内置支持处理时间值,这些时间值可以存储为 Neo4j 数据库中节点和关系的属性。本节将讨论 Cypher 如何处理时区,然后更详细地探讨时间值。
|
时间值类型
下表列出了时间值类型及其支持的组件
类型 | 日期支持 | 时间支持 | 时区支持 |
---|---|---|---|
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
|
|
DATE
、LOCAL TIME
、ZONED TIME
、LOCAL DATETIME
和 ZONED DATETIME
是时间瞬时类型。时间瞬时值表示时间点,具有不同的精度。
相反,DURATION
不是时间瞬时类型。DURATION
表示时间量,捕获两个瞬时之间的时间差,可以为负值。DURATION
捕获两个瞬时之间的时间量,不捕获开始时间和结束时间。
从 Neo4j 5.9 开始,某些时间类型已重命名。下表显示了当前和旧的时间类型名称。
类型 | 旧类型名称 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
时区
时区表示为 UTC 的偏移量,或命名时区的逻辑标识符(这些时区基于 IANA 时区数据库)。在任何情况下,时间都以 UTC 形式存储在内部,时区偏移量仅在显示时间时应用。这意味着时间瞬时可以在不考虑时区的情况下进行排序。但是,如果两个时间在 UTC 中相同,则它们按时区排序。
使用命名时区创建时间时,UTC 的偏移量是根据时区数据库中的规则计算的,以在 UTC 中创建时间瞬时,并确保命名时区是有效的时区。
IANA 时区数据库中的时区规则可能会发生变化。例如,某个区域的夏令时规则可能会发生变化。如果此变化发生在时间瞬时创建之后,则显示的时间可能与最初输入的时间不同,因为涉及到本地时区。但是,UTC 中的绝对时间将保持不变。
在 Cypher 中有三种方法可以指定时区
-
以小时和分钟为单位指定 UTC 的偏移量 (ISO 8601).
-
指定命名时区。
-
同时指定偏移量和时区名称(要求两者匹配)。
有关示例,请参阅 指定时区。
命名时区形式使用 IANA 时区数据库的规则来管理夏令时 (DST)。
可以使用配置选项 db.temporal.timezone
配置数据库的默认时区。此配置选项会影响以下函数创建时间类型的行为
-
获取当前日期和时间,不指定时区。
-
从其组件创建时间类型,不指定时区。
-
通过解析
STRING
创建时间类型,不指定时区。 -
通过组合或选择没有时区组件的值创建时间类型,不指定时区。
-
截断没有时区组件的时间值,不指定时区。
时间瞬时
指定时间瞬时
时间瞬时由三个部分组成:date
、time
和 timezone
。这些部分可以组合起来生成不同的时间值类型。字符 T
是一个字面字符。
时间瞬时类型 | 部分组成 |
---|---|
|
|
|
|
|
|
|
|
|
|
*当 date
和 time
组合时,date
必须完整;即完全识别特定日期。
指定日期
组件 | 格式 | 描述 |
---|---|---|
年份 |
|
使用至少四个数字指定 (某些情况下适用特殊规则)。 |
月份 |
|
使用从 |
星期 |
|
始终以 |
季度 |
|
始终以 |
月份中的日期 |
|
使用 |
一周中的日期 |
|
使用 |
季度的日期 |
|
使用 |
一年中的序数日期 |
|
使用 |
如果年份在 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)的年份)。
以下格式支持指定日期
格式 | 描述 | 示例 | 示例的解释 |
---|---|---|---|
|
日历日期: |
|
|
|
日历日期: |
|
|
|
日历日期: |
|
|
|
日历日期: |
|
|
|
周日期: |
|
|
|
周日期: |
|
|
|
周日期: |
|
|
|
周日期: |
|
|
|
季度日期: |
|
|
|
季度日期: |
|
|
|
季度日期: |
|
|
|
季度日期: |
|
|
|
序数日期: |
|
|
|
序数日期: |
|
|
|
年份 |
|
|
最小的组件可以省略。Cypher 会假设省略的组件具有其可能的最低值。例如,2013-06
将被解释为与 2013-06-01
相同的日期。
指定时间
组件 | 格式 | 描述 |
---|---|---|
|
|
使用 |
|
|
使用 |
|
|
使用 |
|
|
使用 |
Cypher 不支持闰秒;UTC-SLS(带平滑闰秒的 UTC)用于管理 UTC 和 TAI(国际原子时)之间的时间差异。
以下格式支持指定时间
格式 | 描述 | 示例 | 示例的解释 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
最小的组件可以省略。例如,时间可以使用 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 |
---|---|---|---|---|
|
UTC |
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
时间瞬时的组件
时间瞬时值的组件可以作为属性访问。
组件 | 描述 | 类型 | 范围/格式 | DATE |
ZONED DATETIME |
LOCAL DATETIME |
ZONED TIME |
LOCAL TIME |
---|---|---|---|---|---|---|---|---|
|
|
至少 4 位数字。有关更多信息,请参阅使用 |
||||||
|
一年中的季度组件。 |
|
|
|||||
|
一年中的月份组件。 |
|
|
|||||
|
一年中的星期数组件。[2] |
|
|
|||||
|
一年中的星期数组件所属的年份。[3] |
|
至少 4 位数字。有关更多信息,请参阅使用 |
|||||
|
一个季度中的日期组件。 |
|
|
|||||
|
一个季度中的日期组件( |
|
|
|||||
|
一个月中的日期组件。 |
|
|
|||||
|
一年中的日期组件。 |
|
|
|||||
|
一周中的日期组件(一周的第一天是星期一)。 |
|
|
|||||
|
一周中的日期组件( |
|
|
|||||
|
小时组件。 |
|
|
|||||
|
分钟组件。 |
|
|
|||||
|
秒组件。[4] |
|
|
|||||
|
毫秒组件。 |
|
|
|||||
|
微秒组件。 |
|
|
|||||
|
纳秒组件。 |
|
|
|||||
|
时区组件。 |
|
根据时区指定方式,这将是时区名称或格式为 |
|||||
|
时区偏移量。 |
|
格式为 |
|||||
|
以分钟为单位的时区偏移量。 |
|
|
|||||
|
以秒为单位的时区偏移量。 |
|
|
|||||
|
|
|
对于 |
|||||
|
|
|
对于 |
示例
以下是使用各种时间函数解析瞬时值的示例。有关这些时间函数的更多信息,请参见此处。
使用日历日期格式解析 ZONED DATETIME
RETURN datetime('2015-06-24T12:50:35.556+0100') AS theDateTime
theDateTime |
---|
|
行数:1 |
使用序数日期格式解析 LOCAL DATETIME
RETURN localdatetime('2015185T19:32:24') AS theLocalDateTime
theLocalDateTime |
---|
|
行数:1 |
使用周日期格式解析 DATE
RETURN date('+2015-W13-4') AS theDate
theDate |
---|
|
行数:1 |
解析 ZONED TIME
RETURN time('125035.556+0100') AS theTime
theTime |
---|
|
行数:1 |
解析 LOCAL TIME
RETURN localtime('12:50:35.556') AS theLocalTime
theLocalTime |
---|
|
行数: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 |
---|---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
行数: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 |
---|---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
行数: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 |
---|---|---|---|---|---|
|
|
|
|
|
|
行数:1 |
以下查询展示了如何获取ZONED DATETIME
值的 epoch 时间和与时区相关的部分
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 |
---|---|---|---|---|
|
|
|
|
|
行数:1 |
获取当前年份的第一天
RETURN date.truncate('year') AS day
day |
---|
|
行数:1 |
获取特定日期所在周的星期四的日期
RETURN date.truncate('week', date('2019-10-01'), {dayOfWeek: 4}) AS thursday
thursday |
---|
|
行数:1 |
持续时间
指定持续时间
DURATION
表示时间量,捕获两个时刻之间的时间差,可以为负。
DURATION
的规范以P
为前缀,可以使用基于单位的形式或基于日期和时间的形式
-
基于单位的形式:
P[nY][nM][nW][nD][T[nH][nM][nS]]
-
方括号(
[]
)表示可选组件(值为零的组件可以省略)。 -
n
表示 64 位整数范围内的数值。 -
最后一个(也是最小的)组件的值可以包含小数部分。
-
每个组件必须以表示单位的组件标识符结尾。
-
基于单位的形式使用
M
作为月份和分钟的后缀。因此,时间部分必须始终以T
为前缀,即使日期部分没有给出任何组件。 -
持续时间的最大总长度受 64 位整数可以容纳的秒数限制。
-
-
基于日期和时间的形式:
P<date>T<time>
。-
与基于单位的形式不同,此形式要求每个组件都必须在有效的
LOCAL DATETIME
的范围内。
-
下表列出了基于单位形式的组件标识符
组件标识符 | 描述 | 注释 |
---|---|---|
|
年 |
|
|
月 |
必须在 |
|
周 |
|
|
天 |
|
|
小时 |
|
|
分钟 |
必须在 |
|
秒 |
持续时间的组件
DURATION
可以有多个组件,每个组件都分为月份、天数和秒数组。
DURATION
值的组件在其组件组内截断,如下所示
组件组 | 组件 | 描述 | 类型 | 详细信息 |
---|---|---|---|---|
月 |
|
年的总数。 |
|
每组 |
|
季度的总数。 |
|
每年计算为 |
|
|
月的总数。 |
|
每年计算为 |
|
天 |
|
周的总数。 |
|
每组 |
|
天的总数。 |
|
每周计算为 |
|
秒 |
|
小时的总数。 |
|
每组 |
|
分钟的总数。 |
|
每小时计算为 |
|
|
秒的总数。 |
|
每小时计算为 |
|
|
毫秒的总数 |
|
每组 |
|
|
微秒的总数。 |
|
每毫秒计算为 |
|
|
纳秒的总数。 |
|
每微秒计算为 |
请注意
|
还可以访问由组的第一阶组件限定的组件组的二阶组件
组件 | 组件组 | 描述 | 类型 |
---|---|---|---|
|
月 |
组中不构成完整年的季度数量。 |
|
|
月 |
组中不构成完整年的月数量。 |
|
|
月 |
组中不构成完整季度的月数量。 |
|
|
天 |
组中不构成完整周的天数量。 |
|
|
秒 |
组中不构成完整小时的分钟数量。 |
|
|
秒 |
组中不构成完整分钟的秒数量。 |
|
|
秒 |
组中不构成完整秒的毫秒数量。 |
|
|
秒 |
组中不构成完整秒的微秒数量。 |
|
|
秒 |
组中不构成完整秒的纳秒数量 |
|
示例
以下是使用duration()
函数解析持续时间的示例。有关更多信息,请参阅此处。
14
个天、16
个小时和12
个分钟的持续时间RETURN duration('P14DT16H12M') AS theDuration
theDuration |
---|
|
行数:1 |
5
个月、1
个天和12
个小时的持续时间RETURN duration('P5M1.5D') AS theDuration
theDuration |
---|
|
行数:1 |
45
秒的持续时间RETURN duration('PT0.75M') AS theDuration
theDuration |
---|
|
行数:1 |
2
个周、3
个天和12
个小时的持续时间RETURN duration('P2.5W') AS theDuration
theDuration |
---|
|
行数:1 |
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 |
d.quarters
的值为5
,因为持续时间的一年有四个季度,另外还有五个月中的另一个季度。d.months
的值为17
,因为它将持续时间一年的 12 个月加到五个月中。d.quartersOfYear
是剩余的季度,计数到下一个完整的年份。类似地,d.monthsOfYear
和d.monthsOfQuarter
分别计数到下一个完整年份和季度。请参阅持续时间的组件中的表一阶DURATION
组件和二阶DURATION
组件。
DURATION
值的基于天的组件WITH duration({months: 5, days: 25, hours: 1}) AS d
RETURN d.weeks, d.days, d.daysOfWeek
d.weeks | d.days | d.daysOfWeek |
---|---|---|
|
|
|
行数:1 |
d.weeks
的值为 3,因为查询中的 25 天是三个完整的星期(或 21 天)。d.daysOfWeek
是剩余的天数,计数到下一个完整的星期。请参阅持续时间的组件中的表一阶DURATION
组件和二阶DURATION
组件。
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 |
d.minutes
是小时的 60 分钟和查询中的一分钟的总和,因为duration.hours
和duration.minutes
都是基于秒的组件。类似地,d.seconds
、d.milliseconds
、d.microseconds
和d.nanoseconds
是查询中相关基于秒的组件的总和值。
d.hours
没有考虑查询中的天数,因为duration.days
是一个基于天的组件。
请参阅持续时间的组件中的表一阶DURATION
组件。
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 |
返回的值都计数到下一个完整的小时、分钟或秒。例如,d.microsecondsOfSecond
的值为111111
,因为它是在微秒(四舍五入)中的查询中的111111111
纳秒,但它不是另一个完整的秒。
请参阅持续时间的组件中的表二阶DURATION
组件。
RETURN duration({days: 1, hours: 12}) AS theDuration
theDuration |
---|
|
行数:1 |
DURATION
RETURN duration.between(date('1984-10-11'), date('2015-06-24')) AS theDuration
theDuration |
---|
|
行数:1 |
DATE
值之间的天数RETURN duration.inDays(date('2014-10-11'), date('2015-08-06')) AS theDuration
theDuration |
---|
|
行数:1 |
DATE
RETURN date.truncate('month', date() + duration('P2M')) - duration('P1D') AS lastDay
lastDay |
---|
|
行数:1 |
DURATION
添加到DATE
RETURN time('13:42:19') + duration({days: 1, hours: 12}) AS theTime
theTime |
---|
|
行数:1 |
DURATION
值相加RETURN duration({days: 2, hours: 7}) + duration({months: 1, hours: 18}) AS theDuration
theDuration |
---|
|
行数:1 |
DURATION
乘以一个数字RETURN duration({hours: 5, minutes: 21}) * 14 AS theDuration
theDuration |
---|
|
行数:1 |
DURATION
除以一个数字RETURN duration({hours: 3, minutes: 16}) / 2 AS theDuration
theDuration |
---|
|
行数:1 |
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 |
---|
|
行数:1 |
RETURN ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][date().month-1] AS month
month |
---|
|
行数:1 |