1

我有一个数据库和两个需要交互的表。第一个表是成员表 ( login),它有他们的 id ( id)、名字 ( given_name) 和姓氏 ( family_name)。第二个表在 ISO 8601 字符串中保存人员登录名或成员 ID ( mid) 他们的打卡 ( dateTimeIn) 和打卡 ( ) 日期时间,以及他们可以执行的活动类型 ()。&都是 ISO 8601 日期时间字段,, , ,和都是字符串。绑定这两个表的远程外键是将目录映射到列。dateTimeOuttypedateTimeIndateTimeOuttypeidmidgiven_namefamily_namehours.midlogin.id

login桌子:

CREATE TABLE login(id TEXT PRIMARY KEY NOT NULL, given_name TEXT NOT NULL, family_name TEXT NOT NULL, lastseen INTEGER NOT NULL)

id                   |given_name|family_name
-----------------------------------------------
103673125444466670779|Mark      |Tomlin

hours桌子:

CREATE TABLE hours(mid TEXT, type TEXT, dateTimeIn INTEGER, dateTimeOut INTEGER)

mid                  |type    |dateTimeIn      |dateTimeOut
-----------------------------------------------------------------
103673125444466670779|Meeting |2013-06-04T20:00|2013-06-04T21:00
103673125444466670779|Meeting |2013-06-10T20:00|2013-06-10T21:00
103673125444466670779|Crew    |2013-06-21T22:00|2013-06-22T13:00
103673125444466670779|Crew    |2013-06-22T23:00|2013-06-23T07:00
103673125444466670779|Training|2013-06-23T20:00|2013-06-23T21:00
103673125444466670779|Crew    |2013-06-29T23:00|2013-06-30T07:00
103673125444466670779|Detail  |2013-06-23T17:00|2013-06-23T19:00
103673125444466670779|Meeting |2013-06-25T14:00|2013-06-25T18:00
103673125444466670779|Detail  |2013-06-28T01:00|2013-06-28T08:00
103673125444466670779|Crew    |2013-06-28T19:00|2013-06-28T23:00

我正在寻找的是一个查询,它将为我提供下表中的任何日期范围。例如,对于 2013 年 6 月,它应该产生类似这样的结果。如果我有更多的人登录,那么它也会在下面添加他们,按姓氏、名字排序。

given_name|family_name|Crew|Meeting|Detail|Training
Mark      |Tomlin     |35  |6      |9     |1        

另一个很棒的查询是,如果我可以获得年度视图,添加的每个成员都会成为新行。

given_name|family_name|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec
Mark      |Tomlin     |35 |62 |27 |12 |88 |35 | - | - | - | - | - | -  
4

1 回答 1

1

我确实需要一个查询,它可以为我提供当月每个人的所有当前小时数的列表。我通过以下查询做到了这一点。

SELECT
    *
FROM
    hours
WHERE
    dateTimeIn BETWEEN date('now', 'start of month') AND date('now', 'start of month','+1 month','-1 day');

我首先找到了一个查询,它向我展示了如何给出枢轴的一般外观。从那里开始,我一直在努力,直到找到一个适合我想做的事情的选项。

这个查询给了我每个成员在数据库中的总秒数。

SELECT
    m.id,
    m.given_name,
    m.family_name,
    SUM(CASE WHEN h.type = 'Crew' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Crew,
    SUM(CASE WHEN h.type = 'Detail' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Detail,
    SUM(CASE WHEN h.type = 'Meeting' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Meeting,
    SUM(CASE WHEN h.type = 'Training' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Training
FROM login m JOIN hours h ON m.id = h.mid
GROUP BY m.id;

然后我可以增加这个,只给我当月的运行总数。

SELECT
    m.id,
    m.given_name,
    m.family_name,
    SUM(CASE WHEN h.type = 'Crew' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Crew,
    SUM(CASE WHEN h.type = 'Detail' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Detail,
    SUM(CASE WHEN h.type = 'Meeting' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Meeting,
    SUM(CASE WHEN h.type = 'Training' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Training
FROM login m JOIN hours h ON m.id = h.mid
WHERE
    dateTimeIn BETWEEN date('now', 'start of month') AND date('now', 'start of month', '+1 month', '-1 day')
GROUP BY m.id;

现在我只需要做最后一个来显示这一年的总和。

于 2013-06-29T11:15:02.723 回答