SQLite中两个date之间的差异

如何获得SQLite中两个date之间的差异? 我已经尝试过这样的事情:

SELECT Date('now') - DateCreated FROM Payment 

它每次返回0。

  SELECT julianday('now') - julianday(DateCreated) FROM Payment; 

这两个答案提供的解决scheme有点复杂,因为他们需要。 说付款是在January 6, 2013January 6, 2013创build的。 我们想知道这个date和今天之间的区别。

 sqlite> SELECT julianday() - julianday('2013-01-06'); 34.7978485878557 

差别是34天。 我们可以使用julianday('now')来获得更好的清晰度。 换句话说,我们不需要把date()datetime()函数作为julianday()函数的参数。

天差异

 Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) As Integer) 

小时差

 Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) * 24 As Integer) 

差异在分钟

 Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) * 24 * 60 As Integer) 

秒差

 Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) * 24 * 60 * 60 As Integer) 

SQLite wiki是一个很好的参考, DateAndTimeFunctions页面是一个很好的书签。 记住使用sqlite命令行实用程序来查询也是非常容易的:

 sqlite> select julianday(datetime('now')); 2454788.09219907 sqlite> select datetime(julianday(datetime('now'))); 2008-11-17 14:13:55 

只是写时钟function的一个笔记。 对于那些正在寻找工作时间的人来说,一个非常简单的变化就可以得到小时数,加上分钟的数据显示为大多数工资公司所希望的60分钟。

CAST ((julianday(clockOUT) - julianday(clockIN)) * 24 AS REAL) AS HoursWorked

 Clock In Clock Out HoursWorked 2016-08-07 11:56 2016-08-07 18:46 6.83333332836628 

这个答案有点啰嗦,文档不会告诉你这个(因为他们假设你将date作为UTCdate存储在数据库中),但这个问题的答案在很大程度上取决于你的date存储的时区你也不使用Date('now') ,而是使用julianday()函数来计算这两个date对一个普通的date,然后减去这些结果之间的差异。

如果您的date存储在UTC:

 SELECT julianday('now') - julianday(DateCreated) FROM Payment; 

这是排名第一的答案,也在文档中 。 如果你问我,这只是图片的一部分,而且是一个非常简单的答案。

如果您的date存储在当地时间,使用上面的代码将使您的回答错误 GMT小时偏移的小时数。 如果你在像我这样的东部美国,格林威治标准时间-5,你的结果将有5个小时添加到它。 如果您尝试使DateCreated符合UTC,因为julianday('now')与GMTdatejulianday('now')

 SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment; 

这有一个错误,它会在夏令时(3月至11月)期间为DateCreated添加一小时。 说“现在”是在非DST日的中午,而您在中午六月(DST期间)创build了一些东西,那么结果将在小时部分相隔1小时而不是0小时。 您必须在应用程序代码中编写一个函数来显示结果,以修改结果并从DSTdate中减去一小时。 我这样做,直到我意识到有一个更好的解决scheme,我遇到的问题: SQLite与甲骨文 – 计算date差异 – 小时

相反,正如我指出的那样,在当地时间存储date,使两者匹配到当地时间:

 SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment; 

或在当地时间追加'Z'

 julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z') 

这两个似乎补偿,并没有增加额外的小时为DSTdate和做直接减法 – 所以在中午12时在DST日中午检查时,在非DST日中午检查项目,不会得到一个额外的小时执行计算。

虽然我认识到大多数人会说不要在当地时间将date存储在数据库中,并且将它们存储在UTC中,所以您不会遇到这种情况,并不是每个应用程序都有全世界的用户,而不是每个程序员都想要在他们的系统中将每个date都转换为UTC,然后每次在数据库中执行GET或SET时再处理,并处理是否有地方或UTC的情况。

如果你想在00:00格式的时间:我解决这样的问题:

 select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something