Answers:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
DateCreated
是UTC,它会起作用。相反,如果是当地时间,则必须转换julianday('now')
为当地时间。我找不到任何有此信息的地方。如果您确实julianday('now') - julianday(DateCreated)
喜欢这篇文章,建议使用本地时间存储日期,则您的答案将因与格林尼治标准时间的抵触而偏离,并且是错误的。虽然可能不是将日期存储在本地时间的最佳做法,但它仍然可能在时区无关紧要的应用程序中发生(除非您使用的工具将日期强制显示在您身上)。
julianday('now') - julianday(DateCreated, 'utc')
,则要同时创建两个UTC,则它的工作方式与方法不同julianday('now', 'localtime') - julianday(DateCreated)
。前者不计入夏令时,而是会在3月至11月为创建的日期增加一个小时。后者确实可以解决这个问题。stackoverflow.com/questions/41007455/...
天数差异
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文档是一个很好的参考,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。
如果您想要00:00格式的时间:我就是这样解决的:
select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something
假设您的日期格式如下:“ YYYY-MM-DD HH:MM:SS”,如果您需要查找两个日期之间的月数差:
(strftime('%m', date1) + 12*strftime('%Y', date1)) -
(strftime('%m', date2) + 12*strftime('%Y', date2))
首先,不清楚您的日期格式是什么。已经有一个涉及的答案strftime("%s")
。
我喜欢扩展这个答案。
SQLite仅具有以下存储类:NULL,INTEGER,REAL,TEXT或BLOB。为了简化起见,我将假设日期是实数,其中包含自1970-01-01开始的秒数。这是一个示例架构,我将在其中放入“ 2018年12月1日”的示例数据:
CREATE TABLE Payment (DateCreated REAL);
INSERT INTO Payment VALUES (strftime("%s", "2018-12-01"));
现在,让我们计算出“ 2018年12月1日”与现在之间的日期差(在我写这篇文章时,它是2018年12月12日中午):
日期差(天):
SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
日期差(小时):
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
日期差异(以分钟为单位):
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
日期差异(以秒为单位):
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
如果您希望在两天之间进行记录,
select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
就我而言,我必须以分钟为单位计算差异,julianday()
但无法给出准确的值。相反,我使用strftime()
:
SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60
两个日期都转换为unixtime(秒),然后减去以得到两个日期之间以秒为单位的值。接下来,将其除以60。