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