我是DynamoDB的新手。我希望创建一个表,它使用DeviceID作为哈希键,Timestamp作为我的范围键和一些数据。
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
在SQL中,我们可以将datetime类型用于Timestamp,但在DynamoDB中没有。
答案 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。
答案 3 :(得分:1)
对于我来说,能够在发送查询请求时过滤出结果,我为DateTime使用了时代格式,比使用字符串更有效。
设想以下情况:最后31天,过去24小时……再次可以使用字符串格式,因为它也具有 begins_with 运算符(请检查下面链接中的第三个示例)在AWS文档上),但在排序(比较)和计算时,就性能而言,数字效率要高得多。
将日期时间转换为纪元格式很容易
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 )