【问题标题】:What data type should be used for timestamp in DynamoDB?DynamoDB 中的时间戳应该使用什么数据类型?
【发布时间】:2017-03-26 11:32:56
【问题描述】:

我是 DynamoDB 的新手。我希望创建一个使用 DeviceID 作为哈希键、时间戳作为我的范围键和一些数据的表。

{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }

在 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

【问题讨论】:

标签: datetime amazon-web-services amazon-dynamodb sqldatatypes


【解决方案1】:

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

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

2016-02-15

2015-12-21T17:42:34Z

20150311T122706Z

DynamoDB Data type for Date or Timestamp

是的,当日期存储为字符串时,支持范围查询。 BETWEEN 可用于 FilterExpresssion。我使用下面的过滤器表达式得到了结果中的项目。

FilterExpression没有时间:-

FilterExpression : 'createdate between :val1 and :val2',
ExpressionAttributeValues : {
        ':hkey' : year_val,
        ':rkey' : title,
        ":val1" : "2010-01-01",
        ":val2" : "2010-12-31"
    }

FilterExpression with time:-

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."}}}}}

【讨论】:

  • 但是当它们存储为字符串值时,您可以进行日期范围搜索吗?
  • @notionquest 是的,你能用字符串进行日期和时间范围搜索吗?
  • 我不明白您是如何得出“字符串数据类型应该用于日期或时间戳”的。文档还说您还可以通过纪元时间将数字数据类型用于日期。为什么你认为 String 应该 被用在 Number 之上?
  • 可以使用字符串和数字数据类型。存储 ISO8601 格式时为 String,存储 Epoch 时间时为 Number。更多信息在这里:abhayachauhan.com/2017/12/…
  • @roly 数字也应该可以正常工作,但它们的可读性较差。
【解决方案2】:

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

您可以使用 ISO 格式的 String 或使用 epoch 格式的 Number。

ISO 格式(字符串)的优点是可读性,但 DynamoDB 不支持此格式的生存时间 (TTL)。正如 notionquest 所解释的那样,所有过滤器都可以工作,例如“介于”和“范围”。

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

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

TLDR;

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

【讨论】:

  • 数字可能支持过滤表达式,但基于范围的关键条件仅支持 ISO 格式的字符串
  • @RafaelAlmeida,你是什么意思?你的来源是什么?
  • @ZacharyRyanSmith 我错了 - 事实上,数字属性确实可以用作排序键和过滤器中的键条件。
【解决方案3】:

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

想象一下这些场景:过去 31 天,过去 24 小时,...再次使用字符串格式,因为它也有 begins_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);

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 )

【讨论】:

    【解决方案4】:

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

    可用于日期或时间戳 - 不仅仅是字符串,因为此问题的已接受答案在忽略数字时错误地单挑出来。

    您可以使用数字数据类型来表示日期或时间戳。一种方法是使用纪元时间 - 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。例如,纪元时间 1437136300 表示 2015 年 7 月 17 日下午 12:31:40 UTC。

    有关详细信息,请参阅http://en.wikipedia.org/wiki/Unix_time

    ...

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

    2016-02-15

    2015-12-21T17:42:34Z

    20150311T122706Z

    如需了解更多信息,请参阅http://en.wikipedia.org/wiki/ISO_8601

    DynamoDB Data type for Date or Timestamp

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 2011-09-03
      • 2013-10-19
      • 2011-03-30
      • 2017-06-14
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      相关资源
      最近更新 更多