Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite:按每个日期分组的两个日期之间的差异总和_Sql_Sqlite_Datetime_Group By_Timestamp - Fatal编程技术网

SQLite:按每个日期分组的两个日期之间的差异总和

SQLite:按每个日期分组的两个日期之间的差异总和,sql,sqlite,datetime,group-by,timestamp,Sql,Sqlite,Datetime,Group By,Timestamp,我有一个带有开始和停止日期时间的SQLite数据库 通过以下SQL查询,我得到了启动和停止之间的时差: SELECT starttime, stoptime, cast((strftime('%s',stoptime)-strftime('%s',starttime)) AS real)/60/60 AS diffHours FROM tracktime; 我需要一个SQL查询,它提供多个时间戳的总和,按每天分组,也按时间戳之间的整个日期分组 结果应该是这样的: 2018-08-01:12小

我有一个带有开始和停止日期时间的SQLite数据库

通过以下SQL查询,我得到了启动和停止之间的时差:

SELECT starttime, stoptime, cast((strftime('%s',stoptime)-strftime('%s',starttime)) AS real)/60/60 AS diffHours FROM tracktime; 
我需要一个SQL查询,它提供多个时间戳的总和,按每天分组,也按时间戳之间的整个日期分组

结果应该是这样的:

2018-08-01:12小时 2018-08-02:24小时 2018-08-03:12小时 2018-08-04:0小时 2018-08-05:1小时 2018-08-06:14小时 2018-08-07:8小时 您可以尝试一下,使用CTE RECURSIVE为每个日期的开始时间和结束时间创建一个日历表,并进行一些计算

模式SQLite v3.18

问题1


你的sqlite版本支持CTE吗?是的,CTE是受支持的。我写了一个答案,你可以试试。谢谢你,我喜欢你的解决方案!如何重写小时以小数点后两位显示的应用程序?@baconLX如果要显示小数点后两位,可以尝试使用printf函数。例如,如果我将停止时间增加半小时,则总时间仍将显示x.00,即使它实际上应该是x.50。
CREATE TABLE tracktime(
  id int,
  starttime timestamp,
  stoptime timestamp
);

insert into  tracktime values 
(11,'2018-08-01 12:00:00','2018-08-03 12:00:00');
insert into  tracktime values 
(12,'2018-09-05 18:00:00','2018-09-05 19:00:00');
WITH RECURSIVE cte AS (
    select id,starttime,date(starttime,'+1 day') totime,stoptime
    from tracktime
    UNION ALL
    SELECT  id,
            date(starttime,'+1 day'),
            date(totime,'+1 day'),
            stoptime
    FROM cte
    WHERE date(starttime,'+1 day') < stoptime
)

SELECT  strftime('%Y-%m-%d', starttime),(strftime('%s',CASE 
              WHEN totime > stoptime THEN stoptime
              ELSE totime
            END) -strftime('%s',starttime))/3600 diffHour
FROM cte;

| strftime('%Y-%m-%d', starttime) | diffHour |
| ------------------------------- | -------- |
| 2018-08-01                      | 12       |
| 2018-09-05                      | 1        |
| 2018-08-02                      | 24       |
| 2018-08-03                      | 12       |