Room database Kotlin Получить данные за этот месяц

Рейтинг: 0Ответов: 1Опубликовано: 09.01.2023

Мне нужно выполнить запрос в БД который отнимет значения суммы одного столбца от другого. Хотел бы отнимать значения которые были записаны только в этом месяце. Попробовал много вариантов, и либо пробовал неправильно либо не нашел ничего подобного.

Это мой Dao

   @Dao
interface Dao {
    @Insert
    fun InsertItemIncome(item: Income)
    @Insert
    fun InsertItemExpence(item: Expence)

    @Query("DELETE FROM income")
    fun deleteAll()
    @Query("SELECT SUM(sum) AS value FROM income")
    fun  getSumIncome(): Flow<Float?>

    @Query("SELECT SUM(sum) AS value FROM expence")
    fun getSumExpence(): Flow<Float?>
    @Query("SELECT (SELECT SUM(sum)  FROM income WHERE strftime('%m', col_date, unixepoch) = '03' AND \n" +
            "strftime('%Y', col_date, unixepoch) = 'now') - (SELECT SUM(sum) s2 FROM expence)")
}

Это мои таблицы

Income

 @Entity(tableName = "income")
data class Income(
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null,
    @ColumnInfo(name = "date")
    var date: Long?,
    @ColumnInfo(name = "type")
    var type: String,
    @ColumnInfo(name = "sum")
    var sum: Float,


)

Expence

@Entity(tableName = "expence")
data class Expence(
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null,
    @ColumnInfo(name = "date")
    var date: Long?,
    @ColumnInfo(name = "type")
    var type: String,
    @ColumnInfo(name = "sum")
    var sum: Float,
)

Данные в поле date записываю в формате timestamp, для этого использую TypeConvertor

object Converters {
  @TypeConverter
  fun fromTimestamp(value: Long?): Date? {
    return value?.let { Date(it) }
  }

  @TypeConverter
  fun dateToTimestamp(date: Date?): Long? {
    return if (date == null) null else date.getTime()
  }
}

Ответы

▲ 0Принят

В данном случае мне помог такой вариант запроса

 @Query("SELECT SUM(sum) FROM income WHERE CAST((date / 1000) AS LONG) BETWEEN strftime('%s','now', 'start of month') AND strftime('%s','now','start of month','+1 month', '-1 day') ")
        fun  getSumIncome(): Flow<Float?>
    
        @Query("SELECT SUM(sum) FROM expence WHERE CAST((date / 1000) AS LONG) BETWEEN strftime('%s','now', 'start of month') AND strftime('%s','now','start of month','+1 month', '-1 day') ")
        fun getSumExpence(): Flow<Float?>
        @Query("SELECT (SELECT SUM(sum)  FROM income WHERE CAST((date / 1000) AS LONG) BETWEEN strftime('%s','now', 'start of month') AND strftime('%s','now','start of month','+1 month', '-1 day')) - (SELECT SUM(sum) s2 FROM expence WHERE CAST((date / 1000) AS LONG) BETWEEN strftime('%s','now', 'start of month') AND strftime('%s','now','start of month','+1 month', '-1 day'))")
        fun getBalance(): Flow<Float?>