【问题标题】:sqlite rounding 'error'sqlite 舍入“错误”
【发布时间】:2014-09-02 15:13:48
【问题描述】:

我在 Android 设备上使用 SQLite。

我正在尝试将时间戳转换为儒略日,并通过将结果转换为整数来舍入儒略日。出于某种原因,2456902.0 被四舍五入为 2456901。(我也使用“round”函数得到相同的结果)

我确实需要一种解决方法,但我也想解释一下为什么会发生这种情况,如果有人有的话。

我的代码和结果如下:

cast(julianday((c.ts/1000), 'unixepoch') as int) as day, 
julianday((c.ts/1000), 'unixepoch') as jd 

当 ts = 1409564846705,jd = 2456902.0,day = 2456901(日期时间为 Mon Sep 01 04:47:26 CDT 2014)

当 ts = 1409631153881,jd = 2456902.8,day = 2456902(日期时间为 Mon Sep 01 23:12:33 CDT 2014)

我正在尝试将时间戳转换为儒略日以按天分组记录,但有些数据落入了错误的日期(如您在上面看到的,如果我按天分组会产生两条记录,但日期是同一天的一部分)。我求助于:strftime('%d', datetime((c.ts/1000), 'unixepoch', 'localtime')) 作为一天。这样做的问题是,如果我查询超过一个月,就会有重复的“月中日”。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    儒略日数在中午有整数值,所以一天的开始在整数之间:

    > SELECT julianday(1409631153881/1000, 'unixepoch', 'start of day');
    2456902.5
    

    将儒略日数字四舍五入为整数是没有意义的,除非您准确定义是想要前一个中午还是下一个中午。


    如果您只想按天分组,请将值转换为日期字符串:

    date(c.ts / 1000, 'unixepoch', 'localtime')
    

    如果您想要一个可以转换为数字的值,请将年份和年份中的日期结合起来:

    cast(strftime('%Y%j', c.ts / 1000, 'unixepoch', 'localtime') as int)
    

    或者,只需将时间戳除以一天中的毫秒数,然后您需要减去时区的适当偏移量。

    【讨论】:

    • 感谢您的快速回复。你已经回答了部分问题。我试图将时间戳转换为儒略日以按天对记录进行分组,但有些数据落入了错误的日期(如上所示,如果我按天分组,将产生两条记录,但我的日期是同一天)。我求助于:strftime('%d', datetime((c.ts/1000), 'unixepoch', 'localtime')) 作为一天。这样做的问题是,如果我查询超过一个月,就会有重复的“月中日”。你能提出一个替代方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2018-03-05
    相关资源
    最近更新 更多