SQLite中2个日期之间的差异

时间:2008-11-14 10:08:32

标签: sqlite

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

SELECT Date('now') - DateCreated FROM Payment

每次都返回0.

11 个答案:

答案 0 :(得分:102)

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

答案 1 :(得分:31)

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

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

差异是34天。我们可以使用julianday('now') 更清晰。换句话说,我们不需要放 date()datetime()作为julianday()的参数 功能

答案 2 :(得分:20)

SQLite wiki是一个很好的参考,DateAndTimeFunctions页面是一个很好的书签。记住使用sqlite命令行实用程序查询很容易也很有用:

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

答案 3 :(得分:4)

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

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

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

这是排名靠前的答案,也在the documentation。如果你问我,这只是图片的一部分,也是一个非常简单的答案。

如果您的日期以当地时间存储,则使用上述代码会使您的答案错误按GMT偏移量的小时数。如果你和我一样在美国东部,那是格林威治标准时间-5,你的结果将会增加5个小时。如果您尝试使DateCreated符合UTC,因为julianday('now')违反了GMT日期:

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

这有一个错误,它会在夏令时(3月至11月)期间为DateCreated添加一小时。假设“现在”是在非DST日中午,并且您在6月(夏令时期间)中午创建了一些东西,您的结果将相隔1小时,而不是0小时,小时部分。您必须在应用程序的代码中编写一个函数,该函数显示结果以修改结果并从DST日期减去一小时。我做到了,直到我意识到我遇到的问题有更好的解决方案:SQLite vs. Oracle - Calculating date differences - hours

相反,正如我所指出的那样,对于以当地时间存储的日期,请将两者匹配为当地时间:

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的情况。

答案 4 :(得分:2)

只是编写时钟功能的注释。对于那些寻找工作时间的人来说,只需要一个非常简单的变化就可以得到小时加上分钟的百分比显示为大多数工资公司想要的60%。

Clock In Clock Out HoursWorked 2016-08-07 11:56 2016-08-07 18:46 6.83333332836628

use

答案 5 :(得分:2)

如果您想要00:00格式的时间: 我解决了这个问题:

select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

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

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

答案 9 :(得分:0)

首先,您不清楚日期格式是什么。 已经有一个涉及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

答案 10 :(得分:0)

如果您想以秒为单位

SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')