【问题标题】:Operating with datetimes in SQLite在 SQLite 中操作日期时间
【发布时间】:2016-11-04 09:41:46
【问题描述】:

我有兴趣了解在 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 返回“天”的(小数)数 - 即 24 小时周期,从原始日期的中午 ​​UTC 开始。这通常不是你需要的,除非你碰巧住在 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(或日期或日期时间)的最佳方法是什么,其中日期时间将被格式化为'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

【问题讨论】:

  • 您使用哪种编程语言?如果这很重要,也许不同的嵌入式数据库引擎更适合您的需求。
  • 我结合了python和sqlite。

标签: date datetime time sqlite


【解决方案1】:

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

SQLite 没有内置函数来计算日期/时间差异;您必须先将日期/时间值转换为某个数字。从技术角度来看,您使用 (Julian) 天还是秒并不重要。在你的程序中使用任何更容易的东西。

如果您开始使用不同的格式,您可能希望将产生的差异转换回该格式,例如:

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

【讨论】:

  • 请注意,儒略日数的精度受底层 double 浮点类型的限制。对于 2^21 (1029-09-15) 和 2^22 (6771-07-07) 之间的值,这意味着 2^-31 天或 40.23 µs 的分辨率。对于大多数用途来说已经足够了。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多