我有一个Pythonic系统,可将学生缺勤数据存储在SQLite数据库中。每行都包含缺勤的开始时间和结束时间,以自1970年1月1日以来的秒数表示。要求我添加一项功能,以限制每周缺勤的小时数。
使用这样的语句听起来很容易拉出小时数:
SELECT (sum(ending-starting)/3600)
FROM requests
WHERE student_id = {x}
AND starting BETWEEN {y} AND ({y}+604800)
AND approved = 1
问题在于,限制必须仅是定义为“强制性在场”的小时数。例如,如果用户将8:00到17:00的时间定义为“强制在场”,那么将在上面的代码中计算从周日14:00开始到同一天结束的缺勤情况。 24小时,而实际上只有9小时。
“强制性存在”在数据库中定义为两个数字参数:“早晨”和“晚上”(始终为一小时)。有没有一种方法可以在考虑到这两个数字的情况下进行上述计算? 如果无法在sql中完成,我很想听听如何在sql中选择数据,然后在python中执行计算。
答案 0 :(得分:0)
我相信以下可能会满足您的要求:-
SELECT
(
sum((
(ending - starting)
-(
CASE WHEN starting < strftime('%s',date(starting,'unixepoch')||' 08:00')
THEN strftime('%s',date(starting,'unixepoch')||' 08:00') - starting
ELSE 0
END
+
CASE WHEN ending > strftime('%s',date(starting,'unixepoch')||' 17:00')
THEN ending - strftime('%s',date(starting,'unixepoch')||' 17:00')
ELSE 0
END
)
) /3600)
) AS ha, *
FROM requests
WHERE student_id = {x}
AND starting BETWEEN {y} AND ({y}+604800)
AND approved = 1
;
答案 1 :(得分:0)
MikeT的答案并不完全奏效,但可以肯定地帮助我达到了预期的结果。这是完美的陈述:
SELECT
(
sum((
(ending - starting)
-(
CASE WHEN starting < strftime('%s',date(starting,'unixepoch')||printf(' %02d:00', morning))
THEN strftime('%s',date(starting,'unixepoch')||printf(' %02d:00', morning)) - starting
ELSE 0
END
+
CASE WHEN ending > strftime('%s',date(ending,'unixepoch')||printf(' %02d:00', evening))
THEN ending - strftime('%s',date(ending,'unixepoch')||printf(' %02d:00', evening))
ELSE 0
END
)
) /3600.0
-(
(24-evening+morning)
*
(round(julianday(ending, 'unixepoch'))-round(julianday(starting, 'unixepoch')))
)
)) AS ha
FROM requests
INNER JOIN students ON requests.student_id = students.ID
INNER JOIN institutes ON students.inst_id = institutes.ID
WHERE student_id = {x}
AND starting BETWEEN {y} AND ({y}+604800)
AND approved = 1;
非常感谢您的帮助!