我是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中并没有这个类型。
使用String数据类型可表示日期或时间戳。
其中一种方法是使用ISO 8601字符串,如下所示:
2016-02-15
2015-12-21T17:42:34Z
20150311T122706Z
是的,在字符串格式存储日期时支持范围查询。可以在FilterExpresssion上使用BETWEEN。我已经使用以下过滤表达式获取了结果中的项目。
不带时间的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"
}
数据库数值:
格式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 格式的字符串或者使用 epoch 格式的数字。
ISO 格式(字符串)的优点是易于人类阅读,但 DynamoDB 不支持此格式的 Time To Live (TTL)。所有过滤器都可用,例如 'between' 和 'range',如 notionquest 所解释的那样。
对于 DynamoDB,Time To Live(TTL) 允许您定义表中的项目何时过期,以便可以自动从数据库中删除它们。
使用 epoch 格式(数字类型)的优点是可以使用 TTL 功能和所有过滤器。
简而言之;
Epoch 格式(数字类型) - 可以使用 Time To Live
ISO 格式(字符串类型) - 无法使用 Time To Live,但更易读
为了在发送查询请求时过滤结果,我使用了epoch格式的DateTime,这比使用字符串更有效。
想象一下这些场景:过去31天,过去24小时...使用字符串格式也可以实现所有这些场景,因为它还具有begins_with运算符(请查看AWS文档下面链接中的第3个示例),但是数值类型在排序(比较)和计算方面更加高效。
将日期时间转换为epoch格式很容易。
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 )
在选择适当的格式时,请考虑您的应用程序的具体要求。如果您主要需要对日期进行排序、比较或查询,则 ISO 8601 格式通常更适合。例如,假设您想要查找所有创建于2023年9月的项目,那么您可以很容易地使用 ISO 8601 完成此操作,并且具有人类可读性的优势:
SELECT * from MyTable WHERE pk = 'x' AND sk begins_with('2023-09')
另一方面,如果您需要进行计算或时区转换,则将日期存储为 Unix 时间戳可能更可取。如果您希望使用DynamoDB TTL功能,则还需要使用 Unix 时间戳,该功能需要以秒为单位的 unix epoch 数字类型。