Sqlite 日期差

Sqlite 日期差,sqlite,Sqlite,我试图找出这两个日期之间的差异,并将其显示为天数、小时数和分钟数 下面是它们现在的格式,下面是我提出的,但它似乎不起作用 2017年5月18日下午4:57 select *,strftime('%H:%M',CAST ((julianday('Completed Date') - julianday('Created Date')) AS REAL),'12:00') from report 5/18/17 4:57 PM在SQLite中不是有效的时间字符串格式,因此将strftime与这种格

我试图找出这两个日期之间的差异,并将其显示为天数、小时数和分钟数

下面是它们现在的格式,下面是我提出的,但它似乎不起作用

2017年5月18日下午4:57

select *,strftime('%H:%M',CAST ((julianday('Completed Date') - julianday('Created Date')) AS REAL),'12:00') from report

5/18/17 4:57 PM
在SQLite中不是有效的时间字符串格式,因此将
strftime
与这种格式一起使用没有意义。您只能将
strftime
与有效的时间字符串格式一起使用,例如
YYYY-MM-DD
YYYY-MM-DD HH:MM:SS

如果要计算创建日期和完成日期之间的差异,则需要计算这两个日期之间的秒数,并使用该秒数计算天数、小时数和分钟数

SELECT strftime('%s',"Completed Date") - strftime('%s', "Created Date") from report;

一天有86400秒,一小时有3600秒,一分钟有60秒。您应该能够从这里计算其余的数据。

假设您不能或不想更改数据库结构的日期格式。如果这是可能的,那么一定要这样做,而且要容易得多。
输出(见下文)有不同的日期格式,只是为了显示,在输出中保留您自己的格式当然是可能的

我正在使用一些常用的表表达式

  • 首先将日期拆分为可重用的部分
  • 修复单个格式
  • 将它们分为两个适合strftime的日期
有一些沉重的字符串操纵和一点大胆的“+12”/“+AM”在其中

然后我使用kimbaudis方案进行计算。
直接进入秒数的kimbaudi积分,
我在和朱利安·戴斯玩的时候浪费了一些时间

WITH parts -- splitting for reuse
(   wrongcomonth, 
    codayyear, wrongcohours, wrongcomins, wrongcom, 
    wrongcrmonth,  
    crdayyear, wrongcrhours, wrongcrmins, wrongcrm
) as
(select  
    substr(Completed_Date, instr(Completed_Date, '/'), -2) as wrongcomonth,
    substr(Completed_Date, instr(Completed_Date, ' '), -5) as codayyear,
    substr(Completed_Date, instr(Completed_Date, ':'),-2) as wrongcohours,
    substr(Completed_Date, instr(Completed_Date, ':')+1,2) as wrongcomins,
    substr(Completed_Date, instr(Completed_Date, 'M')+1,-2) as wrongcom,
    substr(Created_Date, instr(Created_Date, '/'), -2) as wrongcrmonth,
    substr(Created_Date, instr(Created_Date, ' '), -5) as crdayyear,
    substr(Created_Date, instr(Created_Date, ':'),-2) as wrongcrhours,
    substr(Created_Date, instr(Created_Date, ':')+1,2) as wrongcrmins,
    substr(Created_Date, instr(Created_Date, 'M')+1,-2) as wrongcrm
 from report),
 -- another "with"
     pretty -- fixing formats
(   coyear, comonth, coday, cohours, comins,
    cryear, crmonth, crday, crhours, crmins
) as
(select
    '20'||substr( codayyear, -2) as coyear,
    substr('0'||wrongcomonth, -2) as comonth,
    substr(replace(replace('_'||codayyear, '_/','_0'), '_', ''), 1,2) as coday,
    substr('0'||(wrongcohours+replace(wrongcom, 'PM', '12')), -2) as cohours,
    substr('0'||replace(wrongcomins, ' ', ''), -2, 2) as comins,
    '20'||substr( crdayyear, -2) as cryear,
    substr('0'||wrongcrmonth, -2) as crmonth,
    substr(replace(replace('_'||crdayyear, '_/','_0'), '_', ''), 1,2) as crday,
    substr('0'||(wrongcrhours+replace(wrongcrm, 'PM', '12')), -2) as crhours,
    substr('0'||replace(wrongcrmins, ' ', ''), -2, 2) as crmins
from parts),
-- another "with"
    times -- two, in correct format and order
(Completion_Time, Creation_Time
) as 
( select
    coyear||'-'||comonth||'-'||coday||' '||cohours||':'||comins as Completion_Time,
    cryear||'-'||crmonth||'-'||crday||' '||crhours||':'||crmins as Creation_Time
from pretty)
-- now the real thing, as proposed by kimbaudi
select  Creation_Time, Completion_Time, 
       ((strftime('%s', Completion_Time)-strftime('%s', Creation_Time))/(24*60*60))||'d '||
       (((strftime('%s', Completion_Time)-strftime('%s', Creation_Time))/(60*60))%24)||'h '||
       (((strftime('%s', Completion_Time)-strftime('%s', Creation_Time))/(60))%60)||'m'
from times;
MCVE
.dump
,具有一些不同的日期和第二行用于测试:

-- cleanup 
drop table if exists report;

-- make playground
BEGIN TRANSACTION;
CREATE TABLE report ("Completed_Date" date, "Created_Date" date);
INSERT INTO report VALUES('5/8/17 10:57 AM','3/8/17 9:33 AM');
INSERT INTO report VALUES('12/31/16 4:1 PM','10/10/16 7:31 PM');
COMMIT;
输出(注意,与OP给出的日期相比,测试日期有意不同):


错误的日期格式(如@CL在评论中所示)是否会影响您的回答?在这种情况下,您的答案似乎没有抓住重点。我的答案只是基于
报告
表,该表有两个日期时间列:
创建日期
完成日期
。我不明白什么是错误的日期格式。OP似乎希望使用
strftime(“%H:%M”)
获取两个日期之间的小时数和分钟数:创建日期和完成日期。然而,这是行不通的。我认为找到两个日期之间差异的唯一方法是使用
strftime(“%s”)
以秒为单位计算差异,并使用该值以天、小时、分钟为单位计算差异。您是否尝试过strftime是否适用于
5/18/17 4:57 PM
,即OP给出的日期示例?它不适用于SQLite SQLite 3.18.0。不,我没有,因为strftime不适用于
5/18/17 4:57 PM
。用这种特殊格式查找日期之间的差异是没有意义的,因为在SQLite中,这种格式是无效的。如果OP希望查找日期(创建日期和完成日期)之间的差异,则只能通过首先计算有效日期时间格式(例如YYYY-MM-DD)的差异(以秒为单位)来完成。还有其他有效的日期时间格式。提供完整答案的第二部分是可以的。但是你应该在你的回答中解释一下,也就是说,你遗漏了第一个更难的部分,它采用了OPs不寻常的格式来适应strftime。或者,您可以建议更改他的数据库结构以适合您的解决方案。这两种方法都可以避免给人这样的印象,即你没有真正阅读问题,并且提供了一个不能真正解决老年退休金问题的答案。我只看到一个日期。你能再给我一些吗?你能解释一下格式吗(虽然它似乎是“月/日/年h:mm”)?您希望输出结果如何?
2017-03-08 09:33|2017-05-08 10:57|61d 1h 24m
2016-10-10 19:31|2016-12-31 16:01|81d 20h 30m