SQLite - группировка по месяцам на основе отметки времени UNIX - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблема с использованием SQLite3 с комнатой (v2.2.5) в Android. Я храню метки времени для некоторых журналов, используя метку времени 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>>

Вот вывод, который я получаю. Если я пытаюсь подсчитать количество экземпляров по месяцам, все будет работать нормально, просто неверно будет число месяца для августа и сентября.

enter image description here

1 Ответ

1 голос
/ 28 апреля 2020

Вот что я подозреваю:

strftime('%m', ...) возвращает двухсимвольные строки как '01', '02', ... '08', '09', ... '12'. Ваш ORM берет эти строки и преобразует их в целые числа для хранения в этом классе TempHolder. Какой бы подпрограмме преобразования она ни пользовалась, она смотрит на ведущий символ '0', присутствующий в 9 строках, решает, что это означает, что это восьмеричные константы с основанием 8, и выполняет соответствующее преобразование. 08 и 09, конечно, являются недопустимыми восьмеричными числами, но вместо вызова исключения код конвертации обрабатывает их как 0.

Держу пари, если вы измените свой запрос на

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

вы получите ожидаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...