Sqlite 日期差
我试图找出这两个日期之间的差异,并将其显示为天数、小时数和分钟数 下面是它们现在的格式,下面是我提出的,但它似乎不起作用 2017年5月18日下午4:57Sqlite 日期差,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与这种格
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的日期
直接进入秒数的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