Android 如何计算表中的连续日期数?

Android 如何计算表中的连续日期数?,android,sql,sqlite,Android,Sql,Sqlite,在我的Android应用程序中,我需要跟踪保存在数据库表中的连续日期的最长条纹和当前条纹。我甚至不知道从哪里开始让它起作用。我能想到的最好办法是查询表中的每一行,并以编程方式迭代所有行,以找到存在差距的地方。效率不高。有谁有更好的主意吗?基本上你一个月有一天 因此,您只需将天数与所需数字进行比较 如果有差距,你可以通过从一个月的天数中减去计数来轻松找到。例如,您有计数(访问天数),其中月份=1 它返回20天,但是一月有31天,所以11天有一个间隔,下面是sqlite的日期函数 您可以使用以下函

在我的Android应用程序中,我需要跟踪保存在数据库表中的连续日期的最长条纹和当前条纹。我甚至不知道从哪里开始让它起作用。我能想到的最好办法是查询表中的每一行,并以编程方式迭代所有行,以找到存在差距的地方。效率不高。有谁有更好的主意吗?

基本上你一个月有一天 因此,您只需将天数与所需数字进行比较

如果有差距,你可以通过从一个月的天数中减去计数来轻松找到。例如,您有
计数(访问天数),其中月份=1
它返回20天,但是一月有31天,所以11天有一个间隔,下面是sqlite的日期函数

您可以使用以下函数 如
SELECT date('now'、'年初'、'+9个月'、'weekday 2')

编辑

对不起,每个人的解决方案都很难看。是的,我知道


创建表访问(访问日期时间戳,访问整数); 您每天在此表中创建一条记录,指示 用户是联机还是脱机使用
“现在”,1或0(在线/离线)。然后你浏览这些记录。
您当月的记录将是一个带1和0的整数数组。
调用
vistedrecordsformonth

伪代码:

      int online=0;
      int offline=0;     
for(int i=0;i<vistedrecordsformonth.size();i++){    
      boolean flag=false;         
   if(vistedrecordsformonth[i]==1){ //visited
      if(!flag&&i!=0) //check for flag and not 0 index to insert a record
      {
      streaksMap.put(online,offline); //or insert a record into another streakmap or table 
      online=0;
      offline=0;     
      }
      flag=true;
      online++; 
   }
   else{
      flag=false;
      offline++;
   }
} //end of for    
int-online=0;
int离线=0;

对于(int i=0;i这里有一个我认为非常酷的纯SQL解决方案。假设表中的日期是唯一的(并不是说只对它们进行分组太难)您可以使用从这里改编的方法。我浏览了示例,发现有一些语法错误,所以希望我没有在下面的回答中重复这些错误。我可能使用了一些保留关键字,因此您可能需要改编

首先创建一个非常大的日期表,以满足您的需要。我不确定SQLite的最佳方法是什么,但在SQL Server中,您可以将整数插入Datetime字段,它会将整数隐式转换为日期。有许多方法可以将整数插入表中

无论如何,一旦创建了日期表,使用条纹表中的最小和最大日期作为范围限制器,从日期表向左连接到条纹表。 让我们称之为SQL 0

SELECT Dates.Date,
       CASE 
         WHEN StreakTable.DATE IS NULL THEN 0 
         ELSE 1 
       END AS Result 
FROM   Dates 
       LEFT JOIN StreakTable 
         ON Dates.DATE = StreakTable.DATE 
WHERE  Dates.DATE BETWEEN (SELECT MIN(DATE) AS MinDate 
                           FROM   StreakTable) AND (SELECT MAX(DATE) AS MaxDate 
                                                    FROM   StreakTable) 
让我们调用以下SQL 1

SELECT Date, 
       Result, 
       (SELECT COUNT(*) 
        FROM   (SQL 0) S 
        WHERE  S.Result <> SV.Result 
               AND S.GameDate <= SV.GameDate) AS RunGroup 
FROM   (SQL 0) SV 
在这一点上,你可以做一些非常酷的事情,比如回答: 最长的连胜是什么

SELECT TOP 1 * 
FROM   (SQL 2) A 
WHERE  Result = 1 
ORDER  BY Games DESC 
截至最近日期的当前连胜是多少

SELECT *  
FROM (SQL2) A 
WHERE EndDate = (SELECT Max(Date) 
FROM Streak)
我们有多少连续三次或更多

SELECT Result, 
  COUNT(*) as NumberOfStreaks 
FROM (SQL 2) A 
GROUP BY Result 
WHERE Days >= 3

我仍然不知道如何使用它。如果今天是1/9,并且在我的数据库中我有日期1/1、1/2、1/3、1/4、1/5、1/7、1/8、1/9(每天1/1和1/9之间,除了1/6之外)然后,我需要一个5表示最长的连胜,一个3表示当前连胜。检查总数会给我9天中的8天,这样我就知道有间隔,但这不会给我最长和当前的连胜计数。你可以将日期按周分割,并根据这一情况评估连胜。使用
%w第0-6周的星期日==0%00-53年的W周
。简单的方法就是用
访问的天数
登录的天数
组成一张表格,你可以在一个月内轻松地计算这两个天数。我想我解释得不对。我不需要计算天数,我需要连续计算天数。@Nick aye。我找到你了,很快就解决了问题谢谢。也许这个链接会给你一些想法:
SELECT Result, 
  COUNT(*) as NumberOfStreaks 
FROM (SQL 2) A 
GROUP BY Result 
WHERE Days >= 3