在Neptune等基于Gremlin的数据库中存储日期/时间戳的正确方法
Amazon Neptune Gremlin数据库存储时间戳的正确方案
两种方案的优劣对比
1. 直接存储datetime对象(推荐)
- 原理:Python gremlin驱动会自动将
datetime.datetime类型序列化为Gremlin原生的Timestamp类型,Neptune底层会以数值型时间戳格式存储 - 优势:
- 原生支持
gte/lte等范围比较操作,性能远高于字符串比较 - 不存在格式兼容性、时区混乱导致的比较错误问题
- 查询时也可直接传入datetime对象作为参数,不需要额外类型转换
- 原生支持
- 注意:建议统一使用UTC时间,即调用
datetime.datetime.utcnow()生成时间戳,避免不同时区写入的时间出现比较错误
示例代码:
# 写入UTC时间戳 current_timestamp = datetime.datetime.utcnow() g.E('d').property('otp_verified_on', current_timestamp).next() # 范围查询示例:查询24小时内验证过的记录 one_day_ago = datetime.datetime.utcnow() - datetime.timedelta(days=1) records = g.E().has('otp_verified_on', gte(one_day_ago)).toList()
2. 转换为字符串存储(不推荐)
- 仅当你有特殊的字符串存储需求时才考虑使用,且必须严格遵循ISO 8601格式生成字符串,保证字典序和时间顺序一致,才能正常完成范围比较
- 缺陷:
- 字符串比较性能低,数据量较大时查询延迟明显更高
- 容易出现格式不统一、时区不一致导致的比较错误
- 后续需要做时间计算时还要额外做类型转换,增加代码复杂度
最终结论
优先选择直接存储datetime对象的方案,是性能最优、兼容性最好的实现方式。
内容的提问来源于stack exchange,提问作者Thirumal
相关产品推荐
相关产品推荐

