ios – 如何计算核心数据中的天数?

我需要计算最后一天的日子,但是不知道该怎么做.
例如我得到这样的核心数据:
|id| isPresent(Bool)| date(NSDate)|
|==|================|=============|
| 1|               0| 2016-02-11  |
| 2|               1| 2016-02-11  |
| 3|               1| 2016-02-12  |
| 4|               0| 2016-02-14  |
| 5|               1| 2016-02-15  |
| 6|               1| 2016-02-16  |
| 7|               1| 2016-02-16  |

我试着检查最后没有呈现(isPresent = 0)的日期,直到今天,并获得了________,所以我可以算几天,这很容易.

但是如果我标记为second2-14 as isPresented = 1(如下表中所示),我将得到最后一个没有显示的是,2,但是不正确的是没有数据,此日期应为0,条纹应从此日期算起

|id| isPresent(Bool)| date(NSDate)|
|==|================|=============|
| 1|               0| 2016-02-11  |
| 2|               1| 2016-02-11  |
| 3|               1| 2016-02-12  |
| 4|               1| 2016-02-14  |
| 5|               1| 2016-02-15  |
| 6|               1| 2016-02-16  |
| 7|               1| 2016-02-16  |

搜索了不同的算法,用于缺少日期的条纹或sql reuests(sql server displaying missing dates),但是无法弄清楚如何在核心数据中使用它.

我在考虑另外一个数据,每次当用户打开应用程序时会保持连续和更新,但是如果用户没有打开应用程序,则会遇到同样的问题.

输出
我需要找到只是连续的日子,当它破裂的日子,所以

对于第一个表:streak = 2或breakDate = 2016-02-14 – 我尝试这个,但我的解决方案错了,因为第二个表

对于第二个表:streak = 3或breakDate = 2016-02-13 – 无法弄清楚如何丢失日期

重要更新:
会有云同步数据,所以我没有看到任何解决方案在应用程序,真的需要找到缺少日期或isPresented = 0在coredata

附:我正在使用swift,如果你能帮助我通过迅速,这将是伟大的,但我也明白Obj-C.对不起,我的英文不好

解决方法

所有sql解决方

请注意,这假设“今天”是计算条件的一​​天. sql返回连续条件的日期,以及在条纹开始之前的日期.

with max_zero_dt (zero_dt) as
(
  select max(dt)
    from ( 
         select max(isPresent) as isPresent,dt from check_tab group by dt
         union select 0,min(dt) from check_tab
         )
   where isPresent = 0
),days_to_check (isPresent,dt) as
(
  select isPresent,dt
    from check_tab ct
    join max_zero_dt on ( ct.dt >= zero_dt )
),missing_days (isPresent,dt) as
(
  select 0,date(dt,'-1 day') from days_to_check
  UNION
  select 0,date('Now')
),all_days_dups (isPresent,dt from days_to_check
  union
  select isPresent,dt from missing_days
),all_days (isPresent,dt) as
(
  select max(isPresent) as isPresent,dt
  from all_days_dups
  group by dt
)
select cast(min(julianday('Now') - julianday(dt)) as int) as day_streak,max(dt) as dt
  from all_days
 where isPresent = 0

这是第一个场景的sqlfiddlehttp://sqlfiddle.com/#!7/0f781/2

这是第二种情况的一个sqlfiddlehttp://sqlfiddle.com/#!7/155bb/2

关于fiddleS的注意事项:它们将日期相对于“Today”进行更改,以便准确测试条纹.

下面是它的工作原理:

>摘要:我们将使用零“填写”缺少的日子,然后进行简单的检查以查看最大0日期的时间.但是,如果今天没有行,并且没有行为零,我们必须考虑到.
> max_zero_dt:包含包含最新显式0日期或最早日期减去1天的单个行.这是为了减少稍后查询的行数.
> days_to_check:这是根据最新的0是什么时候减少的行数来检查.
> missing_days:我们需要填写缺少的日子,所以我们得到所有日子的列表减去1天.我们还添加今天,以防万一没有行.
> all_days_dups:我们简单地结合days_to_check和missing_days.
> all_days:在这里,我们每天都会获得’max’isPresent,所以现在我们有真实的搜索日期列表,知道isPresent不会有0的空白.
>最终查询:这是提供条纹和开始日期的简单计算.

假设:

>表名IS:check_tab>当前日期必须在表中为1.否则,条纹为0.如果不是这种情况,则可以修改查询.>如果isPresent的单日同时为0,则为1,则优先级为1,连续可以持续到前一天.>核心数据使用sqlite,而在sqlite中工作的上述sql也可以用于Core Data的数据库.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...