我有一个包含一些日期警报的数据库:
id timealarm status
1 2014-10-23 13:30:00 +0000 1
2 2014-10-23 13:29:00 +0000 1
我试图做的就是将当前日期发送到sql并执行abs,以便获取最接近当前日期的值(日期):
SELECT * FROM records WHERE status = '1' ORDER BY ABS('2014-10-23 13:27:09 +0000' - timealarm) LIMIT 1
在这种情况下,此语法会返回 id 1 ,而不是 id 2 ,为什么以及如何解决此问题?
EDIT
字段timealarm是VARCHAR
答案 0 :(得分:0)
当您尝试相互减去字符串时,数据库会将它们转换为数字。 因此,您最终会从2014年减去2014年,这会导致所有行的值相同。
为了能够计算差异,将日期字符串转换为某个数字(这需要删除时区信息,而SQLite date functions无法理解):
...
ORDER BY abs(julianday('2014-10-23 13:27:09') - julianday(substr(timealarm, 1, 19)))
...