Datetime DynamoDB中的时间戳应该使用什么数据类型?
我是迪纳摩的新手。我希望创建一个表,使用DeviceID作为散列键,时间戳作为范围键和一些数据Datetime DynamoDB中的时间戳应该使用什么数据类型?,datetime,amazon-web-services,amazon-dynamodb,sqldatatypes,Datetime,Amazon Web Services,Amazon Dynamodb,Sqldatatypes,我是迪纳摩的新手。我希望创建一个表,使用DeviceID作为散列键,时间戳作为范围键和一些数据 { DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 } 在SQL中,我们可以使用datetime类型作为时间戳,但在DynamoDB中没有 我应该使用什么数据类型?一串数字? 对于所选的数据类型,我应该使用什么样的时间戳格式?ISO格式(例如:2016-11-11T17:21:07.5272333Z)或大
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
在SQL中,我们可以使用datetime类型作为时间戳,但在DynamoDB中没有
字符串数据类型应用于日期或时间戳 您可以使用字符串数据类型来表示日期或时间戳。 一种方法是使用ISO 8601字符串,如下所示 示例: 2016-02-15 2015-12-21T17:42:34Z 20150311T122706Z 是,当日期存储为字符串时,支持范围查询。介于之间的可用于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"
}
{"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."}}}}}
过滤器随时间的表达式:-
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"
}
{"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."}}}}}
数据库值:-
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"
}
{"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-带时区:
{"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-无时区:-
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"
}
{"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)。所有过滤器的工作方式,如ConferenceQuest所解释的“介于”和“范围”之间 DynamoDB的生存时间(TTL)允许您定义表中的项何时过期,以便可以从数据库中自动删除它们 使用历元格式(数字)的优点是,您可以使用TTL功能和所有过滤器 TLDR强> 历元格式(数字类型)-可以使用生存时间
ISO格式(字符串类型)-不能使用Time To Live,但更易于人类阅读数字数据类型或字符串数据类型 可用于日期或时间戳-不只是字符串,因为此问题的接受答案错误地挑出,而忽略了数字 您可以使用数字数据类型来表示日期或时间戳。一种方法是使用历元时间,即自1970年1月1日UTC 00:00:00起的秒数。例如,大纪元时间1437136300表示2015年7月17日UTC下午12:31:40 有关详细信息,请参阅 您可以使用字符串数据类型来表示日期或时间戳。一种方法是使用ISO 8601字符串,如以下示例所示: 2016-02-15 2015-12-21T17:42:34Z 20150311T122706Z 有关详细信息,请参阅
为了在发送查询请求时能够过滤出结果,我使用了日期时间的历元格式,它比使用字符串更有效 想象一下这些场景:过去31天,过去24小时。。。同样,由于字符串格式也以运算符开头(请查看AWS文档下面链接中的第三个示例),所以可以使用字符串格式进行所有操作,但在排序(比较)和计算时,数值在性能方面要有效得多 很容易将日期时间转换为历元格式 Javascript:
{"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."}}}}}
var-date=新日期();
var epoch=date.getTime();
//转换回日期时间
var初始日期=新日期(历元)代码>我们使用历元时间/格式的数字。我们使用它进行范围搜索,基本上还可以使用客户ID字符串和数字数据类型。存储ISO8601格式时为字符串,存储历元时间时为数字。这里有更多信息:“您可以使用字符串数据类型来表示日期或时间戳。一种方法是使用ISO 8601字符串”。您从()复制屏幕截图的答案,回答这个问题-这个问题实际上重复了回答的第一个问题:但是当它们存储为字符串值时,你能进行日期范围搜索吗?@onceptquest ya,你能用字符串进行日期和时间范围搜索吗?我不知道你是如何得出“字符串数据类型应该用于日期或时间戳”的结论的。文件还说,您还可以通过历元时间为日期使用数字数据类型。为什么您认为应该使用字符串而不是数字?可以使用字符串和数字数据类型。存储ISO8601格式时为字符串,存储历元时间时为数字。此处的更多信息:@roly numbers也可以正常工作,但可读性较差。数字可能支持筛选表达式,但ISO中的字符串只支持基于范围的键条件format@RafaelAlmeida你是什么意思?你的来源是什么?@ZacharyRyanSmith我错了——事实上,数字属性在过滤器中起着排序键和键条件的作用。