因此,我试图查询数据库并指出每个用户要计算的总小时数,以便确定工资。我应该提供该日期,该日期结束的那一周和前一个月的总数在该日期结束。
我有三个查询,但它们不返回任何内容:
SELECT username,SUM((julianday(end_time)-julianday(start_time))*24) as duration from Session where start_time<=DATE('2019-07-20','+1 day') AND start_time>=DATE('2019-07-20','0 day') GROUP BY username
SELECT username,SUM((julianday(end_time)-julianday(start_time))*24) as duration from Session where start_time<=DATE('2019-07-20','+1 day') AND start_time>=DATE('2019-07-20','-7 day') GROUP BY username
SELECT username,SUM((julianday(end_time)-julianday(start_time))*24) as duration from Session where start_time<=DATE('2019-07-20','+1 day') AND start_time>=DATE('2019-07-20','-30 day') GROUP BY username
日期有效,并且已经在数据库中。有人知道怎么回事吗?
数据库中的数据: Dataset
+----------+----------------------+--------------------+--------------------+
| Username | Session_ID | Start_time | End_time |
+----------+----------------------+--------------------+--------------------+
| test9 | X7kP0ARulnaWaiXG2WlH | 2019-7-20 08:54:00 | 2019-7-20 11:57:00 |
+----------+----------------------+--------------------+--------------------+
| test4 | piS6GWIzYUxsv8ibIJWP | 2019-7-20 08:51:00 | 2019-7-20 10:51:00 |
+----------+----------------------+--------------------+--------------------+
| test1 | MVYKrORQseOzhrYfXl3V | 2019-7-20 08:50:00 | 2019-7-20 11:42:00 |
+----------+----------------------+--------------------+--------------------+
| test5 | 6FjiFHK6PHD8_5gKqNPg | 2019-7-20 08:48:00 | 2019-7-20 11:53:00 |
+----------+----------------------+--------------------+--------------------+
| test3 | mdKL06e_5Zt9ISMyPQ3h | 2019-7-20 08:43:00 | 2019-7-20 10:55:00 |
+----------+----------------------+--------------------+--------------------+
| test6 | zIlMPQ8kHw094HJHy6zS | 2019-7-20 08:39:00 | 2019-7-20 12:31:00 |
+----------+----------------------+--------------------+--------------------+
| test2 | rouH_1jFFwdW0RSUP9Nf | 2019-7-20 08:35:00 | 2019-7-20 11:15:00 |
+----------+----------------------+--------------------+--------------------+
| test8 | v8EFrHNchNr156XaOmRk | 2019-7-20 08:23:00 | 2019-7-20 12:06:00 |
+----------+----------------------+--------------------+--------------------+
| test7 | 3rkN1fEx9S6yhx8HaIsX | 2019-7-20 08:19:00 | 2019-7-20 11:57:00 |
+----------+----------------------+--------------------+--------------------+
| test10 | yjslD9UydwMAr0OL-gJ- | 2019-7-20 08:05:00 | 2019-7-20 10:47:00 |
+----------+----------------------+--------------------+--------------------+
预期输出:
在将更多数据集添加到数据库后,它已停止工作。在它有大约26行之前,它一直在工作:
这可能是原因吗?: 在我的日期和时间格式不同之前:例如-2019-12-02 19:26:18 但现在它是这样的:例如-2019-6-1 08:44:00(所有秒00)
[{ 5
答案 0 :(得分:1)
我相信您的问题是日期不是公认的格式,因此在使用julianday函数时,它们将导致空值。也就是说,当月值小于10时,它是个位数,而不是用0填充,因此该数据应为2019-07-20,以供julianday函数使用。
我相信以下内容将为第一个查询产生正确的结果:-
WITH cte(username, session_id, start_time,end_time) AS
(
/* All this to convert dates to the correct format */
SELECT
username, session_id,
substr(start_time,1,5)|| CASE WHEN substr(start_time,7,1) = '-' THEN '0'||substr(start_time,6) ELSE substr(start_time,6) END AS start_time,
substr(end_time,1,5)|| CASE WHEN substr(end_time,7,1) = '-' THEN '0'||substr(end_time,6) ELSE substr(end_time,6) END AS endtime
FROM Session
)
SELECT
username,
SUM((julianday(end_time)-julianday(start_time))*24) AS duration
FROM cte /*<<<<< Use the CTE with the modified dates */
WHERE start_time<=DATE('2019-07-20','+1 days')
AND start_time>=DATE('2019-07-20','0 days')
GROUP BY username
;
当然,更好的解决方案是以公认的格式存储日期时间,在这种情况下,原始查询将可以工作,而无需操纵日期。尽管给定的解决方案不管用。
答案 1 :(得分:0)
假设您的结束时间和开始时间位于一个时区, 以及开始时间和结束时间的差异(以秒为单位),您可以这样做。
select username, sum(TIMESTAMPDIFF(SECOND, start_time, end_time)) as duration
from Session
where start_time between date('2019-07-20') and date_add('2019-07-20', interval 1 day)
group by username;
答案 2 :(得分:0)
所以我想出了另一种方法来解决这个问题:
数据库中设置的数据类型为DATETIME,我用来插入的python脚本是从csv文件插入数据集,该文件缺少前导0。现在,上面的MikeT答案之所以行之有效,是因为操纵日期,但它仅适用于首次查询,因此我不得不想出另一种方式,以便将来避免这种情况。
forpas将此处https://www.db-fiddle.com/f/hFSEmCA7BtNaqhAvsDLjPT/0删除时的日期格式更改为'TEXT'的方法也可以,但是数据集必须具有前导0。
因此,如果将来对任何人有帮助,这是我的解决方案:
我编辑了python代码,以使用datetime库来获取前导0,使用datetime库,我可以隐蔽行中的日期字符串。
这是可能的,因为我在stackoverflow上发布了另一个问题。这里是链接:Inserting date correctly into SQL
感谢Rithin Chalumuri,他找到了这个解决方案。
也:
非常感谢@forpas提供的初步解决方案,该解决方案帮助我确定了问题所在。
非常感谢@MikeT为我提供了另一种解决此问题的方法,而无需通过操纵日期来手动更改日期类型。
非常感谢@Rithin Chalumuri,他为我的python代码问题提供了解决方案,该方法是在缺失0时从数据集中插入数据库时插入0。