DynamoDB中的时间戳应该使用什么数据类型?

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中没有.

  1. 我应该使用哪种数据类型?串?数?
    在此输入图像描述

  2. 对于所选的数据类型,我应该写入什么样的时间戳格式?ISO格式(例如:2016-11-11T17:21:07.5272333Z)或纪元时间(例如:1478943038816)?

  3. 我需要在一段时间内搜索表格,例如:2015年1月1日上午10:00:00至2016年12月31日11:00:00

not*_*est 62

字符串数据类型应该用于日期或时间戳.

您可以使用String数据类型来表示日期或时间戳.一种方法是使用ISO 8601字符串,如下例所示:

2016年2月15日

2015-12-21T17:42:34Z

20150311T122706Z

日期或时间戳的DynamoDB数据类型

是的,当日期存储为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)

  • 我不知道你是怎么到达的"字符串数据类型**应该用于日期或时间戳".文档还说你也可以通过纪元时间使用数字数据类型的日期.为什么你认为String**应该用在数字上? (44认同)
  • @roly 数字也应该可以正常工作,但它们的可读性较差。 (3认同)
  • 以 ISO 8601 格式存储时,可以对字符串日期进行排序,因为 8601 设计为按字母数字排序(在同一时区内)。 (2认同)

小智 10

数据类型取决于您的要求。

您可以使用ISO格式的字符串或使用纪元格式的数字。

ISO格式(字符串)的优点是易于阅读,但是DynamoDB不支持此格式的生存时间(TTL)。如notionquest所述,所有过滤器的工作方式都在“之间”和“范围”之内。

DynamoDB的生存时间(TTL)使您可以定义表中的项目何时过期,以便可以从数据库中自动删除它们。

使用纪元格式(数字)的优点是可以使用TTL功能和所有过滤器。

TLDR;

纪元格式(数字类型)-可以使用生存时间
ISO格式(字符串类型)-无法使用生存时间,但更易读


cel*_*epo 6

数字数据类型字符串数​​据类型

\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\n

2016-02-15

\n\n

2015-12-21T17:42:34Z

\n\n

20150311T122706Z

\n\n

有关更多信息,请参阅http://en.wikipedia.org/wiki/ISO_8601

\n
\n\n

DynamoDB 日期或时间戳的数据类型

\n


Moh*_*deh 6

为了能够在发送查询请求时过滤掉结果,我对 DateTime 使用了纪元格式,它比使用字符串更有效。

想象一下这些场景:过去 31 天,过去 24 小时,......再次使用字符串格式是可能的,因为它也有begin_with运算符(请检查下面 AWS doc 链接中的第三个示例)但数值在术语方面效率更高排序(比较)和计算时的性能。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.KeyConditionExpressions

很容易将日期时间转换为纪元格式

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)