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

我是 DynamoDB 的新手。我希望创建一个表,使用 DeviceID 作为散列键,时间戳作为我的范围键和一些数据。

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

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

  1. 我应该使用什么数据类型? 字符串? 数字?
    enter image description here

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

  3. 我需要在表中搜索一段时间,例如: 2015年1月1日上午10:00:00直到2016年12月31日下午11:00:00

164868 次浏览

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

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

2016-02-15

2015-12-21 T17:42:34Z

20150311T122706Z

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

是的,当日期存储为 String 时支持 Range 查询。之间可以在 FilterExpression 上使用。我使用下面的过滤器表达式得到了结果中的项目。

没有时间的 FilterExpression:-

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

随时间变化的过滤表达式:-

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."}}}}}

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

您可以使用使用 ISO 格式的 String 或使用使用纪元格式的 Number。

ISO 格式(String)的优点是人类可读性,但 DynamoDB 不支持这种格式的 Time To Live (TTL)。所有过滤器的工作原理都是“ between”和“ range”,正如 Notionquest 所解释的那样。

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

使用纪元格式(Number)的优点是可以使用 TTL 特性和所有过滤器。

极低密度辐射;

Epoch 格式(数字类型)-可以使用 Time To Live
ISO 格式(字符串类型)-不能使用生存时间,但更具人类可读性

Number 数据类型 或者字符串数据类型

可用于日期或时间戳 -不仅仅是字符串作为此问题的接受答案,忽略数字时不正确地单选出来。

可以使用数字数据类型表示日期或时间戳。一种方法是使用纪元时间ーー自1970年1月1日协调世界时00:00:00以来的秒数。例如,纪元时间1437136300表示世界协调时2015年7月17日下午12:31:40。

有关更多信息,请参见 http://en.wikipedia.org/wiki/Unix_time

...

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

2016-02-15

2015-12-21 T17:42:34Z

20150311T122706Z

有关更多信息,请参见 http://en.wikipedia.org/wiki/ISO_8601

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

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

想象一下这样的场景: 最后31天,最后24小时,... ... 同样,所有可能使用字符串格式,因为它也有 从... 开始操作符(请在下面的链接上查看 AWS 文档的第三个例子) ,但数值在排序(比较)和计算方面的性能要高效得多。

Https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/query.html#query

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

Javascript:

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


// converting back to date-time
var initial_date = new Date(epoch);

C #

var date = DateTime.UtcNow;
var epoch = new DateTimeOffset(date).ToUnixTimeSeconds();


// converting back to date-time
var initial_date = DateTimeOffset.FromUnixTimeSeconds(epoch);

巨蟒

import time
epoch = time.time()
 

# converting back to date-time
initial_date = time.gmtime(epoch )