Den*_*nis 68 datetime amazon-web-services sqldatatypes amazon-dynamodb
我是DynamoDB的新手.我希望创建一个表,它使用DeviceID作为哈希键,Timestamp作为我的范围键和一些数据.
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
Run Code Online (Sandbox Code Playgroud)
在SQL中,我们可以将datetime类型用于Timestamp,但在DynamoDB中没有.
not*_*est 62
该字符串数据类型应该用于日期或时间戳.
您可以使用String数据类型来表示日期或时间戳.一种方法是使用ISO 8601字符串,如下例所示:
2016年2月15日
2015-12-21T17:42:34Z
20150311T122706Z
是的,当日期存储为String时,支持Range查询.该BETWEEN可以FilterExpresssion使用.我使用下面的过滤器表达式得到了结果中的项目.
FilterExpression没有时间: -
FilterExpression : 'createdate between :val1 and :val2',
ExpressionAttributeValues : {
':hkey' : year_val,
':rkey' : title,
":val1" : "2010-01-01",
":val2" : "2010-12-31"
}
Run Code Online (Sandbox Code Playgroud)
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"
}
Run Code Online (Sandbox Code Playgroud)
数据库值: -
格式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."}}}}}
Run Code Online (Sandbox Code Playgroud)
格式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."}}}}}
Run Code Online (Sandbox Code Playgroud)
小智 10
数据类型取决于您的要求。
您可以使用ISO格式的字符串或使用纪元格式的数字。
ISO格式(字符串)的优点是易于阅读,但是DynamoDB不支持此格式的生存时间(TTL)。如notionquest所述,所有过滤器的工作方式都在“之间”和“范围”之内。
DynamoDB的生存时间(TTL)使您可以定义表中的项目何时过期,以便可以从数据库中自动删除它们。
使用纪元格式(数字)的优点是可以使用TTL功能和所有过滤器。
TLDR;
纪元格式(数字类型)-可以使用生存时间
ISO格式(字符串类型)-无法使用生存时间,但更易读
数字数据类型或字符串数据类型
\n\n可用于日期或时间戳 -不仅仅是字符串,因为此问题的接受答案在忽略数字时错误地挑选出来。
\n\n\n\n\n\n您可以使用数字数据类型来表示日期或时间戳。实现此目的的一种方法是使用纪元时间\xe2\x80\x94自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。例如,纪元时间 1437136300 表示 2015 年 7 月 17 日 12:31:40 PM UTC 。
\n\n有关更多信息,请参阅http://en.wikipedia.org/wiki/Unix_time。
\n\n...
\n\n您可以使用字符串数据类型来表示日期或时间戳。一种方法是使用 ISO 8601 字符串,如以下示例所示:
\n\n2016-02-15
\n\n2015-12-21T17:42:34Z
\n\n20150311T122706Z
\n\n有关更多信息,请参阅http://en.wikipedia.org/wiki/ISO_8601。
\n
为了能够在发送查询请求时过滤掉结果,我对 DateTime 使用了纪元格式,它比使用字符串更有效。
想象一下这些场景:过去 31 天,过去 24 小时,......再次使用字符串格式是可能的,因为它也有begin_with运算符(请检查下面 AWS doc 链接中的第三个示例)但数值在术语方面效率更高排序(比较)和计算时的性能。
很容易将日期时间转换为纪元格式
Javascript:
var date = new Date();
var epoch = date.getTime();
// converting back to date-time
var initial_date = new Date(epoch);
Run Code Online (Sandbox Code Playgroud)
C#
var date = DateTime.UtcNow;
var epoch = new DateTimeOffset(date).ToUnixTimeSeconds();
// converting back to date-time
var initial_date = DateTimeOffset.FromUnixTimeSeconds(epoch);
Run Code Online (Sandbox Code Playgroud)
Python
import time
epoch = time.time()
# converting back to date-time
initial_date = time.gmtime(epoch )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
56156 次 |
最近记录: |