代码之家  ›  专栏  ›  技术社区  ›  thoni56

SQLite时间戳导出

  •  0
  • thoni56  · 技术社区  · 7 年前

    我在MacOS上有一个SQLite3数据库,其中包含时间戳数据(通常类似于27900203.539467)。

    这个 documentation 说日期可以存储为

    REAL - as Julian day numbers, the number of days since noon in Greenwich
           on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
    

    看起来这就是我所拥有的。

    我假设timestamp数据类型在数据库引擎之间不兼容,因此必须在某个地方进行一些转换,并且我假设在从SQLite数据库导出数据时最好这样做。

    我看过 this answer 指的是 this forum post 这表明在SQLite中您可以

    select datetime('40660.9454658044', '+2415018 days', '+12 hours', 'localtime');
    

    (也许2415018是公元前4714年11月24日和其他神奇的日子之间的天数……)

    但是,将本例中的时间戳字符串替换为我所拥有的将导致null。大概是因为'279020203.539467'是另一种时间戳。它也比这个例子大一些。

    但是如何把它转换成一个可用的日期呢?我知道应该在2011/2012年左右。

    将数据解释为“整数”(自1970-01-01起的秒数)给出了1978,因此这也不正确。

    288773834.371606 should be 2010-02-25 07.57
    296636121.950064 should be 2010-05-27 08.55
    

    (如果有必要的话)。

    2 回复  |  直到 7 年前
        1
  •  1
  •   DinoCoderSaurus    7 年前

    好消息是:要将儒略日期转换为“常规”日期格式,您可以使用 datetime(strftime('%J',jtime)) Here's the doc 用于sqlite日期和时间函数。但有坏消息。

    NASA Calculator 计算2010-02-25的儒略日期为2455246。它计算了公元785907年9月2日的公元288773834年的民用日期。sqlite没有使用上面的符号给出相同的结果,但是它没有给出“日期”。

    尽管这些数字看起来像朱利安日期符号,但它们并不是我们一生中的任何日期。

        2
  •  0
  •   thoni56    7 年前
    DATEDIF("2010-02-25 07.57"; "2010-05-27 08.55"; "d")
    

    在MacOS上,本机时间戳是从2001-01-01(2001年1月1日)开始的秒。 以及

    DATEDIF("2001-01-01 00:00"; "2010-02-25 07.57"; "d")
    

    给出3342天,即288748800秒,接近时间戳,但不完全是时间戳,但差异是由

    • DATEDIF只提供全天服务

    修正了这一点,我们得到了大约25000秒的时间来添加,这几乎准确地把我们带到了2010-02-2507.57的时间戳。

    在导出、导出文件的转换或导入期间,将此格式转换为其他格式应该很简单。

    可能最简单的方法是使用

    select ...
        datetime(table.timestamp_field, 'unixepoch', '+31 years')
    from ...