工时费的复杂计算

时间:2019-06-21 13:57:56

标签: sqlite epoch

我有一个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中执行计算。

2 个答案:

答案 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;

非常感谢您的帮助!