以字符串格式存储的 DynamoDB 时间戳属性,应检索指定时间戳范围内的记录

Posted

技术标签:

【中文标题】以字符串格式存储的 DynamoDB 时间戳属性,应检索指定时间戳范围内的记录【英文标题】:DynamoDB timestamp attribute stored in string format, should retrieve records within a specified timestamp range 【发布时间】:2021-05-16 11:39:20 【问题描述】:

Dynamodb 具有时间戳属性,它以字符串格式存储日期和时间“Thu Jan 14 19:55:27 UTC 2021”。 现在,我想检索“2021 年 1 月 11 日星期四 20:55:27 UTC 2021”和“2021 年 1 月 13 日 22:15:27 UTC”之间的记录。 下面是代码:

from datetime import datetime
from boto3.dynamodb.conditions import Attr

def lambda_handler(event, context):
    startdatetime=event["startdate"]
    enddatetime=event["enddate"]
    start=datetime.strptime(startdatetime,"%a %b %d %H:%M:%S UTC %Y")
    end=datetime.strptime(enddatetime,"%a %b %d %H:%M:%S UTC %Y")
    
    fe=Attr('timestamp').between(start,end)
    response = table.scan(
            FilterExpression=fe
    )

这没有给出正确的记录集,因为字符串和日期时间之间发生了比较。 没有将 Attr() 转换为日期时间。 下面是我试过的代码sn-p:

fe=datetime.strptime(str(Attr('timestamp')),"%a %b %d %H:%M:%S UTC %Y").between(start, end)

这也没有帮助。

对此有何建议?

【问题讨论】:

相关:***.com/questions/40561484/… 【参考方案1】:

DynamoDB 对没有日期时间的实际概念的部分进行字符串比较,这就是为什么您必须小心在表中存储日期时间信息的方式。

对于between 查询,推荐使用两种方式存储数据:

UTC 时间的 ISO8601,所以是这样的:2021-02-12T18:50:00.000+00:00 Epoch 时间,距离1970-01-01T00:00:00.000+00:00 的秒数

查询的时候,还需要按照这些规则对要查询的时间戳进行归一化处理,否则不起作用。

底线,你想要查询它的方式不起作用,因为当底层数据结构是字符串时,格式不适合在查询之间。

【讨论】:

以上是关于以字符串格式存储的 DynamoDB 时间戳属性,应检索指定时间戳范围内的记录的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB 表设计模式:使用 utc 时间戳对数据进行分类

在 Dynamodb 索引中使用 set 作为主键

时间戳如何储存数据

DynamoDB中时间戳的数据类型[重复]

DynamoDb 查询存储日期

通过休眠anh html插入时间戳