我有一个数据库,其中的密钥以UTC格式以ISO 8601格式存储时间,如下所示:

(data:key1)
{ "time": "2023-12-10T10:42:50.277Z" }
(data:key2)
{ "time": "2023-12-15T19:02:40.308Z" }
...

我想以某种方式聚合这些键中的数据,假设我想计算时间介于2023-12-10和2023-12-29之间的键的数量.

Redis在其RediSearch模块中包括FT.AGGREGATE命令,以及一个APPLY子命令,其中can be used to transform data使用不同类型的表达式.要将基于字符串的时间转换为数字值,文档中列出的两种转换似乎很好:

101根据数字时间戳值x返回格式化的时间字符串.有关格式化选项,请参阅strftime.不指定FMT相当于%FT%TZ.102与timefmt()相反--使用给定的格式字符串解析时间格式

然而,我找不到一种方法来实现这一点.我首先用FT.CREATE mySearch ON JSON PREFIX 1 data: SCHEMA $.time AS time TEXT创建一个搜索索引,然后聚合我调用FT.AGGREGATE mySearch "*" APPLY "parsetime(@time, '%G-%m-%dT%H:%M:%S.%fZ')" as numericTime,对它的响应是:

1) "1"
2) 1) "time"
   2) "2023-12-14T20:42:50.277Z"
   3) "numericTime"
   4) "null" // <- this should be a unix timestamp instead of null

我做错了什么?将这些时间字符串解析为数值的正确方法是什么?

推荐答案

我花了20分钟查看Redis对包含日期和时间的各种字符串的响应.以下是我了解到的情况:

  • 如果您为搜索提供了无效的格式选项,则搜索将返回null.我try 了%q,这是非常无效的,以确认这一点.
  • Redis的Search documentation指向Python文档strftime.这是不正确的,需要纠正(我会向我们的文档团队指出这一点).搜索不是在Python中实现的,而是在C中.所以,它真的使用了C formatting options,这是略有不同.
  • C格式规范不支持%f微秒,而Python格式规范支持%f微秒.事实上,它根本不支持几分之几秒.所以,这是行不通的.
  • 此外,你的字符串中有milliseconds,而不是微秒.因此,即使Search使用Python规范,它仍然是不正确的. Python可能足够聪明,可以解决这个问题,但我没有测试,因为它没有实际意义.

在我看来,你有两个 Select :

  • If milliseconds matter,您可以在将其保存到Redis之前将其转换为UNIX纪元时间.搜索会很乐意处理含有小数的数字.是亲自做的.完全奏效了.只需确保将其保存为JSON中的number,而不是包含数字的字符串.
  • If milliseconds do not matter,则在将ISO 8601日期保存到Redis之前删除其毫秒数.

还有几件事值得注意:

  • 你的琴弦上有个虫子.你一年要用%G美元.应该是%Y.%G是以周为单位的年份,而不是实际年份.ISO 8601日期使用实际年份.
  • 您可以使用一些快捷方式来解析此格式.%F%Y-%m-%d的缩写,%T%H:%M:%S的缩写.
  • 您可以使用%Z来匹配时区.它比使用硬编码的Z更健壮一点,因为您可能会遇到指定时区的时间.

话虽如此,我可以将您的解析字符串修改为%FT%T%Z,但我认为%Y-%m-%dT%H:%M:%S%Z可能更易于阅读.由个人喜好决定!

无论如何,这是一个有点长的答案,但我当然希望它能有所帮助!

Database相关问答推荐

如何从大型Oracle数据库中删除列?

prisma 中的隐式或显式多对多关系

使用 noSQL 和 MongoDB 在数据库中存储任何类型文件的最佳方法是什么

在 SQL Server 2008 R2 中,如何强制一列对于整个表是唯一的?

Spring Boot:如何使用多个模式并在运行时动态 Select 使用哪一个

如何在 Oracle 中找到指向一条记录的外键依赖项?

SQLite 中内存数据库的优势

怎样有效存储 7.300.000.000 行?

应用程序服务器 JDBC 资源的 DataSource 或 ConnectionPoolDataSource

关系数据库如何在幕后工作?

构建具有多个数据库实例或仅单个实例的 Web 应用程序

在 MySQL 中实现一对一关系时确定外键

Select 最佳主键 + 编号系统

PHP + SQL Server - 如何设置连接字符集?

对于 Postgres (Windows),有没有像 TOAD 一样好的东西?

有人可以详细解释 SOLR requestHandlers 和 responseWriters 吗?

在mysql中 Select 不同的2列组合

如何在 SQL Server 中创建数据库的别名

使用命令行在 Mysql 中导入压缩文件

获取 SQL Server 2008 中新插入行的主键