SQLite - 基于 UNIX 时间戳按月分组

SQLite - group by month based on UNIX timestamp

我在 Android 中将 SQLite3 与 Room (v2.2.5) 结合使用时遇到问题。 我使用 UNIX 时间戳(以毫秒为单位)存储一些日志的时间戳。当我尝试查询它们并按月对它们进行分组时,出现了这个奇怪的错误,其中八月和九月用 0 表示(它们应该是 8 和 9)。

这是 EventLogDao 中的查询:

@Query("""SELECT strftime('%m', date(timestamp / 1000, 'unixepoch')) as month, COUNT(*) as count
                FROM ${EventLog.TABLE_NAME} 
                GROUP BY month""")
abstract fun getAllSortedByTimestamp(): Single<List<TempHolder>>

这是我得到的输出。如果我尝试按月计算实例,一切正常,只是 8 月和 9 月的月份数是错误的。

这是我怀疑正在发生的事情:

strftime('%m', ...) returns 两个字符长的 字符串 '01', '02', ... '08''09'、……'12'。您的 ORM 正在获取这些字符串并将它们转换为 整数 以存储在此 TempHolder class 中。无论它使用什么转换例程,都会查看 9 个字符串中出现的前导 '0' 字符,确定这意味着它们是 base-8 八进制常量,并相应地进行转换。 0809 当然是无效的八进制数,但转换代码不会引发异常,而是将它们视为 0。

我敢打赌,如果您将查询更改为

@Query("""SELECT cast(strftime('%m', timestamp / 1000, 'unixepoch') as integer) as month,
                 COUNT(*) as count
          FROM ${EventLog.TABLE_NAME} 
          GROUP BY month""")

你会得到预期的结果。