SQL-julianday函数的正确日期格式是什么?

时间:2019-12-10 06:46:26

标签: sqlite

因此,我试图查询数据库并指出每个用户要计算的总小时数,以便确定工资。我应该提供该日期,该日期结束的那一周和前一个月的总数在该日期结束。

我有三个查询,但它们不返回任何内容:

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 |
+----------+----------------------+--------------------+--------------------+

预期输出:

enter image description here

结果: enter image description here

在将更多数据集添加到数据库后,它已停止工作。在它有大约26行之前,它一直在工作:

When it was working

这可能是原因吗?: 在我的日期和时间格式不同之前:例如-2019-12-02 19:26:18 但现在它是这样的:例如-2019-6-1 08:44:00(所有秒00)

[{Database before and after 5

3 个答案:

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