当前位置: 首页 > 知识库问答 >
问题:

DynamoDB中的时间戳应使用什么数据类型?

凤自珍
2023-03-14

我是DynamoDB的新手。我希望创建一个使用DeviceID作为哈希键、Timestamp作为范围键和一些数据的表。

{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }

在SQL中,我们可以为Timestamp使用datetime类型,但在DynamoDB中没有。

对于所选的数据类型,我应该使用什么样的时间戳格式?ISO格式(例如:2016-11-11T17:21:07.5272333Z)或纪元时间(例如:1478943038816)?

我需要在一个时间范围内搜索表格,例如:1/1/2015 10:00:00到晚上31/12/2016 11:00:00

共有3个答案

寇和璧
2023-03-14

为了能够在发送查询请求时过滤掉结果,我对DateTime使用了纪元格式,它比使用字符串更有效。

想象一下这些场景:过去31天,过去24小时,...再次使用字符串格式是可能的,因为它也有begins_with运算符(请查看AWS文档下面链接中的第三个示例),但数值在排序时的性能方面要高效得多(比较)

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.KeyConditionExpressions

将日期时间转换为纪元格式很容易

Javascript:

var date = new Date();
var epoch = date.getTime();

// converting back to date-time
var initial_date = new Date(epoch);
陆弘新
2023-03-14

数据类型取决于您的要求。

您可以使用ISO格式的字符串,也可以使用epoch格式的数字。

ISO格式(字符串)的优点是可读性,但DynamoDB不支持此格式的生存时间(TTL)。所有过滤器的工作方式都是“介于”和“范围”之间,如ConceptQuest所述。

DynamoDB的生存时间(TTL)允许您定义表中的项何时过期,以便可以从数据库中自动删除它们。

使用epoch格式(Number)的优点是可以使用TTL功能和所有过滤器。

太长,读不下去了

Epoch格式(数字类型)-可以使用Time To Live
ISO格式(字符串类型)-不能使用Time To Live,但更易于阅读

申屠锦
2023-03-14

日期或时间戳应使用字符串数据类型。

您可以使用字符串数据类型来表示日期或时间戳。一种方法是使用ISO 8601字符串,如以下示例所示:

2016-02-15

2015-12-21T17:42:34Z

20150311T122706Z

日期或时间戳的DynamoDB数据类型

是的,当日期存储为字符串时,支持范围查询。BETWEEN可用于FilterExpression。我使用下面的过滤器表达式获得了结果中的项目。

FilterExpression无时间:-

FilterExpression : 'createdate between :val1 and :val2',
ExpressionAttributeValues : {
        ':hkey' : year_val,
        ':rkey' : title,
        ":val1" : "2010-01-01",
        ":val2" : "2010-12-31"
    }

FilterExpression与时间:-

FilterExpression : 'createdate between :val1 and :val2',
    ExpressionAttributeValues : {
        ':hkey' : year_val,
        ':rkey' : title,
        ":val1" : "2010-01-01T00:00:00",
        ":val2" : "2010-12-31T00:00:00"
    }

数据库值:-

格式1-带时区:

{"Item":{"createdate":{"S":"2010-12-21T17:42:34+00:00"},"title":{"S":"The Big New Movie 2010"},"yearkey":{"N":"2010"},"info":{"M":{"rating":{"N":"0"},"plot":{"S":"Nothing happens at all."}}}}}

格式2-无时区:-

{"Item":{"createdate":{"S":"2010-12-21T17:42:34Z"},"title":{"S":"The Big New Movie 2010"},"yearkey":{"N":"2010"},"info":{"M":{"rating":{"N":"0"},"plot":{"S":"Nothing happens at all."}}}}}
 类似资料:
  • 我目前正在设计一个DynamoDB模式,我不知道我是否在正确的轨道上。 我需要将以下数据存储到DynamoDB表中: 设备ID(编号) 此DynamoDB表的主要查询是通过deviceID和deviceLogType在一个时间范围内查询数据。是 分区键: 排序键: 我的问题是: 上述设计正确吗?

  • 现在,如果我只希望得到时间戳和sensorId,那么我阅读了投影表达式,并尝试执行一个查询(query.json): aws cli命令 给了我:

  • 问题内容: 什么是Unix时间戳?在PHP中,使用日期时,该函数输出一些整数值- 那是什么?我尝试了解这一点,但无法获得满意的答案,尤其是为什么我们需要使用转换日期。 问题答案: 什么是Unix时间戳 简而言之,Unix时间戳是一种跟踪时间(以秒为单位)的方式。此计数从1970年1月1日UTC的Unix Epoch开始。因此, Unix时间戳仅仅是特定日期和Unix Epoch之间的秒数 。还应该

  • BTW在pgadmin中运行完美。 更新:我将其更改为java.sql.timestamp,但仍然不起作用:

  • 我有一个dynamodb表,其结构如下 我想在此表上执行两个主要查询。 获取用户的所有条目- 还有其他建议吗?谢谢你。 2014年5月更新这里发布了一些很好的建议。我仍在尝试如何最好地实现这一点,并希望检查以下方法的优缺点。 我担心这可能会造成很多不一致,好像对usertrips或recenttrips的插入失败了等等。

  • 在DynamoDB中,我有一个表,其中每条记录都有两个日期属性,