我是DynamoDB的新手。我希望创建一个表,该表使用DeviceID作为哈希键,使用Timestamp作为我的范围键和一些数据。
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
在SQL中,我们可以将datetime类型用作时间戳,但在DynamoDB中则没有。
我是DynamoDB的新手。我希望创建一个表,该表使用DeviceID作为哈希键,使用Timestamp作为我的范围键和一些数据。
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
在SQL中,我们可以将datetime类型用作时间戳,但在DynamoDB中则没有。
Answers:
该字符串数据类型应该用于日期或时间戳。
您可以使用String数据类型表示日期或时间戳。一种实现方法是使用ISO 8601字符串,如以下示例所示:
2016-02-15
2015-12-21T17:42:34Z
20150311T122706Z
是的,当日期存储为字符串时,支持范围查询。该BETWEEN可以FilterExpresssion使用。我使用以下过滤器表达式获得了结果中的项目。
没有时间的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."}}}}}
数据类型取决于您的要求。
您可以使用ISO格式的字符串或使用纪元格式的数字。
ISO格式(字符串)的优点是易于阅读,但是DynamoDB不支持此格式的生存时间(TTL)。如notionquest所述,所有过滤器的工作方式都在“之间”和“范围”之内。
DynamoDB的生存时间(TTL)使您可以定义表中的项目何时过期,以便可以将其从数据库中自动删除。
使用纪元格式(数字)的优点是可以使用TTL功能和所有过滤器。
TLDR;
纪元格式(数字类型)-可以使用生存时间
ISO格式(字符串类型)-无法使用生存时间,但更易读
Number数据类型或String数据类型
可以用于日期或时间戳-不仅仅是字符串,因为在忽略数字的同时,此问题的接受答案错误地挑出了答案。
您可以使用数字数据类型表示日期或时间戳。一种方法是使用纪元时间-自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。
为了能够在发送查询请求时过滤掉结果,我为DateTime使用了纪元格式,它比使用字符串更有效。
想象一下以下情况:最近31天,过去24小时,...再次使用字符串格式都可以实现,因为它也具有Begins_with运算符(请检查AWS doc上以下链接中的第3个示例),但是就数值而言,数值更有效排序(比较)和计算时的性能。
将日期时间转换为纪元格式很容易
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 )