管理日期

OrientDB把日期当做一等公民。内部,它将日期存储Unix time格式,也就是作为long 变量,从Unix元年(1970年1月1日)至今的毫秒数。

日期(Date)和日期时间(Datetime)格式

为了更人性化,OrientDB将long的数字转化为日期和日期时间显示。默认的,格式如下:

  • Date Format: yyyy-MM-dd
  • Datetime Format: yyyy-MM-dd HH:mm:ss

默认的格式如果不满足你的需求,可以通过ALTER DATABASE...DATEFORMATDATETIMEFORMAT命令修改。例如,

orientdb> ALTER DATABASE DATEFORMAT "dd MMMM yyyy"

这个命令将当前数据库更新为使用英文日期格式。也就是14 Febr 2015.

SQL 函数(Functions)和方法(Methods)

为了简化日期的管理,OrientDB SQL自动将日期从字符串和long型转换过来。下面的函数和方法让你更加灵活的控制日期:

SQL 描述
DATE() 函数将日期和字符串之间进行转化,可以自定义格式。
SYSDATE() 函数返回当前日期。
.format() 方法返回日期的不同格式。
.asDate() 方法将任意类型转换为日期。
.asDatetime() 方法将任意类型转化为日期时间。
.asLong() 方法将任意日期转化为long格式(Unix时间)。

例如,你需要提取日期中的年份然后排序,可以使用方法 .format()提取成不同格式,使用方式如下:

orientdb> SELECT @RID, id, date.format('yyyy') AS year FROM Order

--------+----+------+
 @RID   | id | year |
--------+----+------+
 #31:10 | 92 | 2015 |
 #31:10 | 44 | 2014 |
 #31:10 | 32 | 2014 |
 #31:10 | 21 | 2013 |
--------+----+------+

除此之外,你还可以聚合结果。例如,按照年聚合:

orientdb> SELECT date.format('yyyy') AS Year, COUNT(*) AS Total 
          FROM Order ORDER BY Year

------+--------+
 Year |  Total |
------+--------+
 2015 |      1 |
 2014 |      2 |
 2013 |      1 |
------+--------+

1970年之前的日期

有一些情况,date和datetime格式无法满足实际需求,例如,考古学的数据库,需要存储1970年之前甚至公元前的日期。你需要在你的日期中定义一个时代或者纪元的变量。例如,如果你想插入一条记录包含罗马建国日, 传统的表示方法表示成April 21, 753 BC。输入公元前的日期,需要执行[ALTER DATABASE DATETIMEFORMAT]命令增加GG变量来表示纪元。

orientdb> ALTER DATABASE DATETIMEFORMAT "yyyy-MM-dd HH:mm:ss GG"

执行命令后,就可以创建带有纪元的日期了。

orientdb> CREATE VERTEX V SET city = "Rome", date = DATE("0753-04-21 00:00:00 BC")
orientdb> SELECT @RID, city, date FROM V

-------+------+------------------------+
 @RID  | city | date                   |
-------+------+------------------------+
 #9:10 | Rome | 0753-04-21 00:00:00 BC |
-------+------+------------------------+

插入时使用.format()

除了更改数据库的日期格式外,还可以在插入日期的时候格式化结果。

orientdb> CREATE VERTEX V SET city = "Rome", date = DATE("yyyy-MM-dd HH:mm:ss GG")
orientdb> SELECT @RID, city, date FROM V

------+------+------------------------+
 @RID | city | date                   |
------+------+------------------------+
 #9:4 | Rome | 0753-04-21 00:00:00 BC |
------+------+------------------------+

这里,创建了一个顶点保存罗马的建国日。然而,没有变更数据库,只是执行CREATE VERTEX命令时指定了格式。

查看Unix时间

除了格式化的日期和日期时间,可以通过方法asLong()查看记录的Unix时间,例如:

orientdb> SELECT @RID, city, date.asLong() FROM #9:4

------+------+------------------------+
 @RID | city | date                   |
------+------+------------------------+
 #9:4 | Rome | -85889120400000        |
------+------+------------------------+

这就意味着,OrientDB将April 21, 753 BC表示成Unix时间:-85889120400000。你可以直接把日期当做long来操作。

orientdb> CREATE VERTEX V SET city = "Rome", date = DATE(-85889120400000)
orientdb> SELECT @RID, city, date FROM V

-------+------+------------------------+
 @RID  | city | date                   |
-------+------+------------------------+
 #9:11 | Rome | 0753-04-21 00:00:00 BC |
-------+------+------------------------+

使用ISO 8601日期

根据ISO 8601规范, 将日期和时间组合成UTC格式: 2014-12-20T00:00:00。 使用这个标准来改变日期的格式:

ALTER DATABASE DATETIMEFORMAT yyyy-MM-dd'T'HH:mm:ss.SSS'Z'