如何获得SQLite中两个日期之间的天数差异?我已经尝试过这样的事情:
SELECT Date('now') - DateCreated FROM Payment
每次返回0.
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
几天的差异
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)
这两个答案都提供了解决方案,因为它们需要更复杂.假设付款已创建January 6, 2013
.我们想知道这个日期和今天之间的区别.
sqlite> SELECT julianday() - julianday('2013-01-06'); 34.7978485878557
差异是34天.我们可以使用julianday('now')
更清晰.换句话说,我们不需要输入
date()
或datetime()
作为参数来julianday()
起作用.
SQLite wiki是一个很好的参考,而DateAndTimeFunctions页面是一个很好的书签.记住使用sqlite命令行实用程序进行查询非常简单,这也很有帮助:
sqlite> select julianday(datetime('now')); 2454788.09219907 sqlite> select datetime(julianday(datetime('now'))); 2008-11-17 14:13:55
这个答案有点冗长,文档不会告诉您(因为他们假设您将日期存储为UTC日期在数据库中),但是此问题的答案很大程度上取决于存储日期的时区您也不必使用Date('now')
,而是使用julianday()
函数来计算两个日期和一个公共日期之间的差,然后彼此减去这些结果的差。
如果您的日期存储在UTC中:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
这是排名最高的答案,并且在文档中。如果您问我,它只是图片的一部分,并且是一个非常简单的答案。
如果您的日期存储在本地时间,使用上面的代码会让你的答案错的小时数你的GMT偏移。如果您和我一样在美国东部,即GMT -5,那么您的结果将增加5个小时。并且,如果您DateCreated
因为julianday('now')
违反格林尼治标准时间而尝试符合UTC :
SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
这有一个错误,它将DateCreated
在夏令时(3月至11月)期间增加一个小时。假设“现在”是非DST的一天中午,并且您在6月(DST期间)中午创建了一些东西,则小时数部分将相隔1小时而不是0小时。您必须在应用程序的代码中编写一个显示结果的函数,以修改结果并从DST日期中减去一个小时。我这样做了,直到意识到有个更好的解决方案: SQLite vs. Oracle-计算日期差-小时
相反,正如我所指出的,对于本地时间存储的日期,请将两者都与本地时间匹配:
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
或附加'Z'
到当地时间:
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
这两个似乎都可以补偿并且不为DST日期添加额外的小时数,而是直接相减-因此,在DST日的正午创建的项目在非DST的正午检查时,将不会获得额外的小时。执行计算。
尽管我认识到大多数人会说不要在本地时间中将日期存储在数据库中,而要在UTC中存储日期,这样您就不会遇到这种情况,但是并不是每个应用程序都具有全世界的受众,也不是每个程序员都想要进行系统中每个日期到UTC的转换,并在他们每次在数据库中执行GET或SET时再次返回,并弄清楚是本地还是UTC。