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

DynamoDB timestamp attribute stored in string format, should retrieve records within a specified timestamp range

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

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() 转换为日期时间。 下面是我试过的代码片段:

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

这也没有帮助。

对此有什么建议吗?

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

对于 between 查询,基本上推荐两种存储数据的方法:

  • UTC 时间的 ISO8601,所以像这样:2021-02-12T18:50:00.000+00:00
  • Epoch时间,从1970-01-01T00:00:00.000+00:00
  • 开始的秒数

你在查询的时候,还需要根据这些规则,对你要查询的时间戳进行归一化处理,否则是不行的。

最重要的是,您想要查询它的方式不起作用,因为当基础数据结构是字符串时,该格式不适合在查询之间进行。