131

如何获得 SQLite 中 2 个日期之间的天数差异?我已经尝试过这样的事情:

SELECT Date('now') - DateCreated FROM Payment

它每次都返回 0。

4

12 回答 12

145
 SELECT julianday('now') - julianday(DateCreated) FROM Payment;
于 2008-11-14T10:11:37.313 回答
84

天数差异

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)
于 2015-12-20T16:43:51.113 回答
35

这两个答案都提供了更复杂的解决方案,因为它们需要。假设付款是在 上创建的January 6, 2013。我们想知道这个日期和今天之间的区别。

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

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

于 2013-02-09T19:12:17.243 回答
24

SQLite 文档是一个很好的参考,DateAndTimeFunctions页面是一个很好的书签。

记住使用 sqlite 命令行实用程序处理查询非常容易,这也很有帮助:

sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
于 2008-11-17T14:21:18.383 回答
12

这个答案有点冗长,文档不会告诉你这一点(因为他们假设你将日期作为 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 并再次返回。

于 2016-12-08T19:54:46.437 回答
6

鉴于您的日期格式如下:“YYYY-MM-DD HH:MM:SS”,如果您需要找出两个日期之间的月数差异:

(strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))

于 2018-04-15T12:53:57.923 回答
4

只是编写时钟函数的注释。对于那些寻找工作时间的人来说,一个非常简单的更改就是将小时数加上分钟数显示为 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
于 2016-08-11T16:26:02.900 回答
4

首先,不清楚您的日期格式是什么。已经有一个答案涉及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
于 2018-12-12T01:43:25.190 回答
3

如果你想要 00:00 格式的时间:我这样解决了:

SELECT strftime('%H:%M',
                CAST((julianday(FinishTime) - julianday(StartTime)) AS REAL),
                '12:00')
FROM something;
于 2017-03-22T12:27:58.533 回答
2

如果你想以秒为单位

SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')
于 2019-12-02T13:02:09.350 回答
1

如果您想要在几天之间的记录,

select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
于 2018-03-28T05:40:59.863 回答
0

就我而言,我必须以分钟为单位计算差异,并且julianday()没有给出准确的值。相反,我使用strftime()

SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60

两个日期都转换为 unixtime(秒),然后减去两个日期之间的秒数。接下来,将其除以 60。

https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions

于 2018-11-28T12:17:03.403 回答