【问题标题】:Room SQLITE query subtracting long timestampsRoom SQLITE 查询减去长时间戳
【发布时间】:2023-03-11 01:33:01
【问题描述】:

我有一个包含两列的表:“TimeStart”和“TimeFinish” 这些列存储一个 long 值,该值使用 typeclassconverter 从 Date 格式转换而来。

我需要编写一个查询来返回表中的所有行,但我需要计算总时间。因此,我需要减去 Timestart 和 TimeFinish 中的 long 值,以接收每行花费的单独时间,然后将它们总计。我想以小时为单位返回一个值,以供用户查看他们花费了多少小时进行活动。我不确定这样做的最佳方法是什么。有人可以帮我写一个具有上述功能的查询吗?

表格

@Entity(tableName = "tableCheckIn")
public class TableCheckIn {

@PrimaryKey(autoGenerate = true)
private long pkCheckInId;

@ColumnInfo(name = "userId")
private long fkUserId;

@ColumnInfo(name = "moodStart")
private long moodStart;

@ColumnInfo(name = "checkInChallenge")
private String checkInChallenge;

@ColumnInfo(name = "checkInGratitude")
private String checkInGratitude;

@ColumnInfo(name = "workoutStart")
@TypeConverters({TimeTypeConverter.class})
private Date workoutStart;

@ColumnInfo(name = "workoutEnd")
@TypeConverters({TimeTypeConverter.class})
private Date workoutEnd;

日期转换器

public class TimeTypeConverter {

@TypeConverter
public static Long toDate(Date date){
    return date == null ? null : date.getTime();
}

@TypeConverter
public static Date toLong(Long timestamp){
    return timestamp == null ? null : new Date(timestamp);
}

 @Query("SELECT (SUM(workoutEnd - workoutStart) / 3600) as totalWorkouts FROM tableCheckIn WHERE userId = :pkUserId")
LiveData<List<ModelStatsTotalWorkoutTime>> totalWorkoutTime(long pkUserId);

回购

public LiveData<List<ModelStatsTotalWorkoutTime>> totalWorkoutTime(long userId) {
    return feelingFitDatabase.getUsersDao().totalWorkoutTime(userId);
}

视图模型

  public LiveData<List<ModelStatsTotalWorkoutTime>> totalWorkoutTime(long userId) {
    return repoUsers.totalWorkoutTime(userId);
}

片段

  mViewModelUsers.totalWorkoutTime(pkUserId).observe(getViewLifecycleOwner(), new Observer<List<ModelStatsTotalWorkoutTime>>() {
        @Override
        public void onChanged(List<ModelStatsTotalWorkoutTime> modelStatsTotalWorkouts) {

            for(ModelStatsTotalWorkoutTime list: modelStatsTotalWorkouts){
                totalWorkoutTimeSeconds += list.getTotalWorkouts();
            }

            totalWorkoutTimeMinutes = totalWorkoutTimeSeconds / 60;
            totalWorkoutTimeHours = totalWorkoutTimeMinutes / 60;

            if (totalWorkoutTimeMinutes <= 59){
                tvTotalTimeWorkingOut.setText(""+totalWorkoutTimeMinutes);
                tvTotalTimeWorkingOutDescription.setText(getString(R.string.workout_minutes));
            } else {
                tvTotalTimeWorkingOut.setText(""+totalWorkoutTimeHours);
                tvTotalTimeWorkingOutDescription.setText(getString(R.string.workout_hours));
            }
        }
    });
}

【问题讨论】:

  • 添加.schema 信息,以及一些示例数据以及“期望的输出”。

标签: android mysql sql sqlite android-sqlite


【解决方案1】:

TimeStartTimeFinish 列包含包含毫秒的 unix 纪元时间戳。
在 SQLite 中,您可以通过以下方式获取可读格式的日期:

select 
  datetime(1596107885085 / 1000, 'unixepoch'),
  datetime(1596108413648 / 1000, 'unixepoch')

返回:

2020-07-30 11:18:05     2020-07-30 11:26:53

要以分钟为单位,您必须除以 1000 以去除毫秒,然后除以 60:

(TimeFinish - TimeStart) / 1000 / 60

因此,您可以通过以下方式获得总差异(以分钟为单位):

select sum(TimeFinish - TimeStart) / 1000 / 60 from tablename

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2014-05-29
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2015-12-22
    相关资源
    最近更新 更多