fix(watch): 修复DM8不兼容的EXTRACT时间差计算

- WatchDataMapper.xml: insertSleep/updateSleep 替换 EXTRACT(H/M FROM interval) 为 TIMESTAMPDIFF
- WatchDataWorkoutMapper.xml: 4处运动时长计算替换为 TIMESTAMPDIFF(SECOND, ...)
- WatchDeviceMapper.xml: 设备看板运动时长字段替换为 TIMESTAMPDIFF
- WatchMapper.java: getDataSteps 去掉 MAX 聚合避免 GROUP BY 报错
This commit is contained in:
2026-05-25 14:07:36 +08:00
parent d11d605418
commit eb33cc2408
4 changed files with 28 additions and 32 deletions
@@ -33,7 +33,7 @@ public interface WatchMapper {
@Select("SELECT AVG(ROUND((CAST(d.wake_up_time AS DATE) - CAST(d.fall_asleep_time AS DATE)) * 24 * 60)) AS aveMinute FROM QH_WAT_DATA_SLEEP_NEW_DAY d LEFT JOIN QH_WAT_DATA_SLEEP_NEW n ON d.sleep_id = n.id WHERE n.id IN (SELECT id FROM QH_WAT_DATA_SLEEP_NEW WHERE bind_user_id = #{id})")
Double getAverageSleep(@Param("id") String id);
@Select("SELECT MAX(data_value) AS dataValue, data_date AS dataDate FROM QH_WAT_DATA_STEPS WHERE bind_user_id = #{id} ORDER BY data_date DESC FETCH FIRST 1 ROWS ONLY")
@Select("SELECT data_value AS dataValue, data_date AS dataDate FROM QH_WAT_DATA_STEPS WHERE bind_user_id = #{id} ORDER BY data_date DESC FETCH FIRST 1 ROWS ONLY")
WatchDataDTO getDataSteps(@Param("id") String id);
@Select("SELECT SUM(data_value) AS totalValue FROM QH_WAT_DATA_DISTANCE WHERE bind_user_id = #{id}")
@@ -233,29 +233,33 @@
insert into QH_WAT_DATA (id, userid, username, orgcode, watch_no, type, data_value, last_update_time)
(select #{id,jdbcType=VARCHAR}, bind_user_id,
#{username,jdbcType=VARCHAR}, #{orgcode,jdbcType=VARCHAR}, #{watchNo,jdbcType=VARCHAR}, 4,
NVL(SUM(EXTRACT(HOUR FROM (sm.end_time - sm.start_time)) * 60 + EXTRACT(MINUTE FROM (sm.end_time - sm.start_time))), 0) as deep_light_times, data_date
NVL(total_minutes, 0), data_date
from (select s.bind_user_id, s.watch_no, s.data_date,
SUM(TIMESTAMPDIFF(MINUTE, sm.start_time, sm.end_time)) as total_minutes,
ROW_NUMBER() OVER (PARTITION BY s.bind_user_id, s.watch_no ORDER BY s.data_date desc) as rn
from QH_WAT_DATA_SLEEP_NEW s
left join QH_WAT_DATA_SLEEP_NEW_MIN sm on s.id = sm.sleep_id
where s.bind_user_id = #{userid,jdbcType=VARCHAR}
and s.watch_no = #{watchNo,jdbcType=VARCHAR}
and s.sleep_flag = '1'
group by s.bind_user_id, s.watch_no, s.data_date
order by data_date desc
FETCH FIRST 1 ROWS ONLY);
group by s.bind_user_id, s.watch_no, s.data_date)
where rn = 1);
</insert>
<update id="updateSleep">
update QH_WAT_DATA wd
set wd.orgcode = #{orgcode,jdbcType=VARCHAR},
wd.data_value = (select NVL(SUM(EXTRACT(HOUR FROM (sm.end_time - sm.start_time)) * 60 + EXTRACT(MINUTE FROM (sm.end_time - sm.start_time))), 0)
wd.data_value = (select NVL(total_minutes, 0)
from (select s.bind_user_id, s.watch_no, s.data_date,
SUM(TIMESTAMPDIFF(MINUTE, sm.start_time, sm.end_time)) as total_minutes,
ROW_NUMBER() OVER (PARTITION BY s.bind_user_id, s.watch_no ORDER BY s.data_date desc) as rn
from QH_WAT_DATA_SLEEP_NEW s
left join QH_WAT_DATA_SLEEP_NEW_MIN sm on s.id = sm.sleep_id
where s.bind_user_id = #{userid,jdbcType=VARCHAR}
and s.watch_no = #{watchNo,jdbcType=VARCHAR}
and s.sleep_flag = '1'
group by s.bind_user_id, s.watch_no, s.data_date
order by data_date desc
FETCH FIRST 1 ROWS ONLY),
group by s.bind_user_id, s.watch_no, s.data_date)
where rn = 1),
wd.last_update_time = (select data_date from (
select data_date
from QH_WAT_DATA_SLEEP_NEW
@@ -20,9 +20,7 @@
ELSE 0
END
) AS sugarCalories,
SUM(NVL(EXTRACT(SECOND FROM (end_time_stamp - start_time_stamp)) +
EXTRACT(MINUTE FROM (end_time_stamp - start_time_stamp)) * 60 +
EXTRACT(HOUR FROM (end_time_stamp - start_time_stamp)) * 3600, 0)) as "totalTime"
SUM(NVL(TIMESTAMPDIFF(SECOND, start_time_stamp, end_time_stamp), 0)) as "totalTime"
FROM
QH_WAT_DATA_WORKOUT
WHERE
@@ -88,9 +86,7 @@
ELSE 0
END
AS sugarCalories,
NVL(EXTRACT(SECOND FROM (end_time_stamp - start_time_stamp)) +
EXTRACT(MINUTE FROM (end_time_stamp - start_time_stamp)) * 60 +
EXTRACT(HOUR FROM (end_time_stamp - start_time_stamp)) * 3600, 0) as "totalTime"
NVL(TIMESTAMPDIFF(SECOND, start_time_stamp, end_time_stamp), 0) as "totalTime"
from
QH_WAT_DATA_WORKOUT
WHERE
@@ -104,9 +100,7 @@
<select id="selectselectSportTimingTotal" resultType="com.renkang.watch.entity.WatchDataWorkout">
select
NVL(SUM(calorie),0) as "calorie",
NVL(SUM(EXTRACT(SECOND FROM (end_time_stamp - start_time_stamp)) +
EXTRACT(MINUTE FROM (end_time_stamp - start_time_stamp)) * 60 +
EXTRACT(HOUR FROM (end_time_stamp - start_time_stamp)) * 3600),0) as "totalTime"
NVL(SUM(TIMESTAMPDIFF(SECOND, start_time_stamp, end_time_stamp)),0) as "totalTime"
from
QH_WAT_DATA_WORKOUT
WHERE
@@ -245,9 +239,7 @@
<select id="selectselectSportTimingTotalNew" resultType="com.renkang.watch.entity.WatchDataWorkout">
select
NVL(SUM(calorie),0) as "calorie",
NVL(SUM(EXTRACT(SECOND FROM (end_time_stamp - start_time_stamp)) +
EXTRACT(MINUTE FROM (end_time_stamp - start_time_stamp)) * 60 +
EXTRACT(HOUR FROM (end_time_stamp - start_time_stamp)) * 3600),0) as "totalTime",
NVL(SUM(TIMESTAMPDIFF(SECOND, start_time_stamp, end_time_stamp)),0) as "totalTime",
MIN(start_time_stamp) AS "dataDate"
from
QH_WAT_DATA_WORKOUT
@@ -438,7 +438,7 @@
COALESCE(steps.step_value, 0) AS stepValue,
COALESCE(steps.last_upload_time, NULL) AS stepTime,
COALESCE(workout.start_time_stamp, NULL) AS durationTime,
COALESCE(EXTRACT(MINUTE FROM (workout.end_time_stamp - workout.start_time_stamp)),0) AS durationTotalValue,
COALESCE(TIMESTAMPDIFF(SECOND, workout.start_time_stamp, workout.end_time_stamp),0) AS durationTotalValue,
workout.workout_type AS workoutType,
COALESCE(hr.errorNum, 0) AS rateAbnormalValue,