管理日期
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...DATEFORMAT
和 DATETIMEFORMAT
命令修改。例如,
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'