如何在SQLite IOS中添加ABS strftime

时间:2017-05-18 11:08:37

标签: ios sqlite

我正在处理一些数据库任务,我需要根据今天最近的日期来获取记录。如下面的截图。

Record date in DB

现在我想要的是今天是2017-05-18,所以我应该在on_date 2017-09-22获得记录,当on_date越过/将跨越2017-09-22然后我得到一个记录on_date 2017-10-04等等。

我尝试使用ORDER BY ABS(strftime(“%s”,on_date) - strftime(“%s”,“2017-05-18”))ASC和我的查询,它显示了2017年的记录 - 09-22。

但是如果我改变ORDER BY ABS(strftime(“%s”,on_date) - strftime(“%s”,“2017-09-23”))ASC那么我没有得到2017年的记录 - 10-04但获得2017-09-22日期的记录

任何帮助将不胜感激

由于 Gurmandeep Singh

1 个答案:

答案 0 :(得分:0)

据我所知,日期记录的排序是您描述的不受欢迎的行为(并不完全清楚),尤其是2017-10-04在其他结果之间的位置。

我认为你没有注意到三个小而重要的事实:

    您在示例输入中
  • 201 7 -10-04记录
  • 您在样本输入中
  • 201 6 -10-04记录
    但它与您尝试的参考日期的距离要远得多
  • 2017-09-23更接近2017-09-22而不是2017-10-04

牢记这些,您的查询在我看来工作得很好 原谅我相信你在查看结果时混淆了2016年和2017年,因为你专注于几个月和几天。

为了演示,我做了这个mcve(在SQLite 3.18.0 2017-03-28上):

CREATE TABLE toy (on_date date);
INSERT INTO toy VALUES('2017-09-22T00:00:00.000Z');
INSERT INTO toy VALUES('2017-04-11T00:00:00.000Z');
INSERT INTO toy VALUES('2016-10-20T00:00:00.000Z');
INSERT INTO toy VALUES('2016-10-04T00:00:00.000Z');
INSERT INTO toy VALUES('2017-10-04T00:00:00.000Z'); -- intentionally added
COMMIT;

然后尝试了您描述的查询:

1):

select on_date from toy 
ORDER BY ABS( strftime( "%s", on_date ) - strftime( "%s", '2017-05-18' ) ) ASC;

输出(第3行10-04):

2017-04-11T00:00:00.000Z
2017-09-22T00:00:00.000Z
2017-10-04T00:00:00.000Z
2016-10-20T00:00:00.000Z
2016-10-04T00:00:00.000Z

2):

select on_date from toy
ORDER BY ABS( strftime( "%s", on_date ) - strftime( "%s", '2017-09-23' ) ) ASC;

输出(第2行10-04):

2017-09-22T00:00:00.000Z
2017-10-04T00:00:00.000Z
2017-04-11T00:00:00.000Z
2016-10-20T00:00:00.000Z
2016-10-04T00:00:00.000Z

然后我又尝试了2017-09-30,这比10-04更接近于9-22。

3)

select on_date from toy
ORDER BY ABS( strftime( "%s", on_date ) - strftime( "%s", '2017-09-30' ) ) ASC;

输出(第1行10-04):

2017-10-04T00:00:00.000Z
2017-09-22T00:00:00.000Z
2017-04-11T00:00:00.000Z
2016-10-20T00:00:00.000Z
2016-10-04T00:00:00.000Z

说明:

请注意,我将2017-10-04的记录添加到数据库中,因为您似乎认为它存在。
但是您的样本输入不包含它 我认为你所描述的不受欢迎的行为的一部分是由那个丢失的记录引起的。

最重要的是,您的实验日期2017-09-23仍然比2017-10-04更接近2017-09-22。这就是我在2017-09-30添加查询的原因 那个作为第一个结果给出2017-10-04。

如果我对我的假设是正确的(如果我错了就忽略其余的假设),那么我相信你可能在制作mcve时发现了你的错误,而不仅仅是制作截图。
请允许我建议在未来花费精力制作一个真实的,文本的mcve 检查术语“橡皮鸭”,这是非常有用的,制作一个非常好的mcve实际上是相同的,只是一个橡皮鸭实际上至少理解你所说的语法。
为了获得橡胶mcve ducking的最大好处,创建一个玩具数据库,您可以在其中看到同样的问题,然后从SQLite命令行工具中执行.dump
就这样,你有90%的非常好的mcve。