SQLite 中两个日期之间的差异

如何在 SQLite 中获得两次约会之间的天数差异? 我已经尝试过这样的方法:

SELECT Date('now') - DateCreated FROM Payment

每次都返回0。

177607 次浏览
 SELECT julianday('now') - julianday(DateCreated) FROM Payment;

SQLite 文档是一个很好的参考资料,日期和时间函数页面是一个很好的书签。

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

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

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

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)

只是写时钟函数的注意事项。对于那些寻找工作时间的人来说,一个非常简单的改变就可以得到工作时间加上会议记录,按照大多数工资单公司的要求,以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

这个答案有点冗长,文档不会告诉你这个(因为它们假设你在数据库中以 UTC 日期的形式存储日期) ,但是这个问题的答案很大程度上取决于你的日期存储在哪个时区。您也不使用 Date('now'),而是使用 julianday()函数,根据一个公共日期计算两个日期,然后相互减去这些结果之间的差异。

如果您的日期是以 UTC 格式存储的:

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

这是排名最高的答案,也是在 文件。如果你问我,这只是图片的一部分,也是一个非常简单的答案。

如果您的日期存储在当地时间,使用以上代码将使您的答案 的小时数,您的 GMT 偏移量是。如果你像我一样在美国东部,也就是格林尼治标准时间 -5,你的测试结果会增加5个小时。如果你尝试让 DateCreated与 UTC 保持一致,因为 julianday('now')与 GMT 日期相反:

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

这有一个错误,它将增加一个小时的 DateCreated是在夏令时(三月至十一月)。假设“现在”是在一个非夏令时的中午,而你在六月(夏令时期间)的中午创建了一些东西,你的结果将给出1小时的间隔,而不是0小时,小时的部分。您必须在应用程序的代码中编写一个显示结果的函数来修改结果并从 DST 日期中减去一个小时。我这样做了,直到我意识到有一个更好的解决方案,我所面临的问题: SQLite 与 Oracle-计算日期差异-小时

相反,正如我所指出的,对于以本地时间存储的日期,要使两者都与本地时间相匹配:

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

或将 'Z'附加到当地时间:

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

这两种方法似乎都可以弥补 DST 日期的不足,不需要为 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;

如果你想在两天之间做记录,

select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;

鉴于您的日期格式如下: “ YYYY-MM-DD HH: MM: SS”, 如你需要找出两个日期在月份数目上的差异:

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

在我的例子中,我必须以分钟为单位计算差值,而 julianday()没有给出准确的值。相反,我使用 strftime():

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

这两个日期都转换为 unixtime (秒) ,然后减去以获取 以秒为单位,然后除以60。

Https://www.sqlite.org/cvstrac/wiki?p=dateandtimefunctions

首先,不清楚你的日期格式是什么。 已经有了一个涉及 strftime("%s")的答案。

我想详细解释一下这个答案。

SQLite 只有以下存储类: NULL、 INTEGER、 REAL、 TEXT 或 BLOB。 为了简化问题,我假设日期为 REAL,包含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 strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')