如何获得 SQLite 中 2 个日期之间的天数差异?我已经尝试过这样的事情:
SELECT Date('now') - DateCreated FROM Payment
它每次都返回 0。
如何获得 SQLite 中 2 个日期之间的天数差异?我已经尝试过这样的事情:
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 文档是一个很好的参考,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 小时。如果您因为违反 GMT 日期而尝试DateCreated
遵守 UTC :julianday('now')
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 中,这样你就不会遇到这种情况,但并不是每个应用程序都有全球受众,也不是每个程序员都想要每次他们在数据库中执行 GET 或 SET 并处理确定某些内容是本地的还是 UTC 时,都将系统中的每个日期转换为 UTC 并再次返回。
鉴于您的日期格式如下:“YYYY-MM-DD HH:MM:SS”,如果您需要找出两个日期之间的月数差异:
(strftime('%m', date1) + 12*strftime('%Y', date1)) -
(strftime('%m', date2) + 12*strftime('%Y', date2))
只是编写时钟函数的注释。对于那些寻找工作时间的人来说,一个非常简单的更改就是将小时数加上分钟数显示为 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
首先,不清楚您的日期格式是什么。已经有一个答案涉及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
如果你想要 00:00 格式的时间:我这样解决了:
SELECT strftime('%H:%M',
CAST((julianday(FinishTime) - julianday(StartTime)) AS REAL),
'12:00')
FROM something;
如果你想以秒为单位
SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')
如果您想要在几天之间的记录,
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。