Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime DynamoDB中的时间戳应该使用什么数据类型?_Datetime_Amazon Web Services_Amazon Dynamodb_Sqldatatypes - Fatal编程技术网

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

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作为散列键,时间戳作为范围键和一些数据

{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
在SQL中,我们可以使用datetime类型作为时间戳,但在DynamoDB中没有

  • 我应该使用什么数据类型?一串数字?

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

  • 我需要在表格中搜索一段时间,例如:2015年1月1日上午10:00:00到2016年12月31日晚上11:00:00


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

    您可以使用字符串数据类型来表示日期或时间戳。 一种方法是使用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我错了——事实上,数字属性在过滤器中起着排序键和键条件的作用。