我在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(日期时间是CDT 2014年9月1日星期一)

当ts = 1409631153881,jd = 2456902.8,day = 2456902(日期时间是CDT 2014年9月1日星期一)

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

最佳答案

朱利安天数在中午具有整数值,因此一天的开始是整数之间的一半:

> 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)


另外,只需将时间戳除以一天中的毫秒数即可,但是您需要减去时区的适当偏移量。

关于android - sqlite舍入“错误”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25626782/

10-12 00:29