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

时间:2016-11-12 09:34:03

标签: datetime amazon-web-services amazon-dynamodb sqldatatypes

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

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

在SQL中,我们可以将datetime类型用于Timestamp,但在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

4 个答案:

答案 0 :(得分:44)

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

  

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

     

2016-02-15

     

2015-12-21T17:42:34Z

     

20150311T122706Z

DynamoDB Data type for Date or Timestamp

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

没有时间的FilterExpression: -

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

FilterExpression with time: -

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

答案 1 :(得分:6)

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

您可以使用ISO格式的字符串或使用纪元格式的数字。

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

  

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

使用纪元格式(数字)的优点是可以使用TTL功能和所有过滤器。

TLDR;

Epoch格式(数字类型)-可以使用生存时间
ISO格式(字符串类型)-无法使用生存时间,但更易于阅读

答案 2 :(得分:1)

数字数据类型字符串数据类型

可以用于日期或时间戳记-不仅仅是字符串,因为在忽略数字的同时,此问题的接受答案错误地挑出了答案。

  

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

     

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

     

...

     

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

     

2016-02-15

     

2015-12-21T17:42:34Z

     

20150311T122706Z

     

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

DynamoDB Data type for Date or Timestamp

答案 3 :(得分:1)

对于我来说,能够在发送查询请求时过滤出结果,我为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);

C#

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

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

Python

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