在SQLite

时间:2016-11-04 09:41:46

标签: date datetime time sqlite

我有兴趣了解在SQLite中使用日期时间进行操作的不同可能性,并了解其优缺点。我没有找到任何关于所有替代方案的详细解释。

到目前为止,我已经了解了

  

SQLite实际上没有时间戳的本机存储类/   日期。它将这些值存储为NUMERIC或TEXT类型的值   取决于输入格式。使用内置函数完成日期操作   日期/时间功能,它们知道如何转换来自另一个的输入   格式。

(引自here

当需要在日期时间之间进行任何操作时,我看到了两种不同的方法:

julianday 功能

SELECT julianday(OneDatetime) - julianday(AnotherDatetime) FROM MyTable;

返回的天数,但这可能是小数。 因此,您还可以通过一些额外的操作获得一些其他时间度量。 For instance, to get minutes

SELECT CAST ((
    julianday(OneDatetime) - julianday(AnotherDatetime)
) * 24 * 60 AS INTEGER)

显然julianday可能会导致一些问题:

  

请记住,julianday会返回(小数)“天”的数字。    - 即自原始日期中午UTC以来的24小时。这通常不是你所需要的,除非你碰巧住在西边12小时   格林威治。例如。如果你住在伦敦,今天早上也是如此   julianday昨天下午。

this post中的更多信息。

strftime 功能

SELECT strftime("%s", OneDatetime)-strftime("%s", AnotherDatetime) FROM MyTable;

返回的秒数。同样,您还可以通过一些额外的操作获得一些其他时间度量。例如,要获得分钟:

SELECT (strftime("%s", OneDatetime)-strftime("%s", AnotherDatetime))/60 FROM MyTable;

更多信息here

到目前为止,我的结论是:julianday似乎更容易使用,但可能会导致一些问题。 strftime似乎更冗长,但也更安全。它们都只提供单个单位的结果(天或小时或分钟或秒),但不是多个组合。

问题

1)是否有其他可能与日期时间一起操作?

2)直接获得两个日期时间format(或日期或日期时间)的差异的最佳方法是什么,其中datetime将被格式化为'YYYY-mm-dd HH:MM:SS',结果将是同样格式的东西?

我会想象下面的内容会起作用,但事实并非如此:

SELECT DATETIME('2016-11-04 08:05:00') - DATETIME('2016-11-04 07:00:00') FROM MyTable;
> 01:05:00

1 个答案:

答案 0 :(得分:3)

计算差异时,朱利安日数字非常安全。 唯一的问题是如果你试图通过截断任何小数位将它们转换为日期;这会导致中午,而不是午夜。 (如果你试图将它们存储在整数变量中,也会发生同样的情况。)但这不是你在这里做的。

SQLite没有内置函数来计算日期/时间差异;您必须先将日期/时间值转换为某个数字。从技术角度来看,无论你使用(朱利安)天还是秒,都无关紧要;使用程序中更容易的东西。

如果您使用其他格式,可能需要将产生的差异转换回该格式,例如:

time(difference_value, 'unixepoch')  -- from seconds to hh:mm:ss
time(0.5 + difference_value)         -- from Julian days to hh:mm:ss