我正在编写 Android 应用程序,其中我使用以下代码获取当月生日的 friend 列表:
Calendar c = Calendar.getInstance();
int month = c.get(Calendar.MONTH) + 1;
String query = "select name, birthday, uid, pic_square from user
where (substr(birthday_date, 0, 2) =" + month +") AND uid IN
(SELECT uid2 FROM friend WHERE uid1 = me()) order by birthday_date ASC";
但现在我想获取 future 30 天内过生日的 Facebook 好友列表,我知道 java 代码可以通过使用当前日期获取接下来的 30 天,如下所示:
Date today = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(today);
cal.add(Calendar.DAY_OF_MONTH, +30);
Date today30 = cal.getTime();
我知道用 Python 查询来获取接下来 30 天内的生日,但我不知道我需要在 Java 中使用什么代码,如果可能的话,请为我替换下面用 Java 编写的查询:-
query = "SELECT username FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) AND (substr(birthday_date, 0, 2) = {0} AND substr(birthday_date, 3, 5) >= {1} AND substr(birthday_date, 3, 5) <= {2})").format(today.strftime("%m"), today.strftime("%d"), today30.strftime("%d");
所以这里我只想把python代码换成java代码
最佳答案
好吧,首先,请务必征求 friends_birthday
的许可,否则您将无法获得 friend 的生日日期。
如果您不熟悉 Graph API Explorer ,您应该 - 您可以测试 FQL 查询以发现问题。
单击“获取访问 token ”并在“好友数据权限”中选中“friends_birthday” 您可以开始测试查询了。
其次,所有生日都与实际出生年份一起存储,因此在 FQL 查询中请求 above today
将始终返回任何内容。
“固定”日期 - 您实际上可以像这样选择生日和今年的一部分:
SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user
WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me())
AND birthday_date != 'null'
问题来了:
所选字段不是用户表的一部分,您不能对其进行排序,甚至不能对其使用 WHERE。 我的猜测是,您必须获得所有 friend 的生日并使用 JAVA 来过滤数据 - 这应该很容易,因为自定义选定字段中的日期是 2013 年而不是实际年份。
欢迎调用Test带有此链接的 FQL。
编辑#1
我想说清楚一点,你想转换的原始查询不会
fetch list of Facebook friends those birthdays in next 30 days
在查询中手动替换值时,我看到它会返回生日在 同一月 的 2 个给定日期之间的所有 friend 。 它不会查找所有在未来 30 天内过生日的 friend 。
编辑#2
我找到了一种方法让所有 friend 都在这个月和下个月过生日——这比遍历所有 friend 列表要好得多。
SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user
WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me())
AND birthday_date != 'null'
AND (substr(birthday_date,0,2)='02' OR substr(birthday_date,0,2)='03')
检查列表并过滤今天之前的列表和从今天起不超过 30 天的列表应该变得容易得多 - 这是我能想到的最佳解决方案。
编辑#3 实际上,我可以使用编辑 #2 中的相同查询进行过滤,以获取今天之后的所有查询,并按它排序:
SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user
WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me())
AND birthday_date != 'null'
AND (substr(birthday_date,0,2)='02' OR substr(birthday_date,0,2)='03')
AND birthday_date > '02/23/2013'
ORDER BY birthday_date
如果您想限制 10 个:
SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user
WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me())
AND birthday_date != 'null'
AND (substr(birthday_date,0,2)='02' OR substr(birthday_date,0,2)='03')
AND birthday_date > '02/23/2013'
ORDER BY birthday_date
LIMIT 10
编辑#4
如果用 Java 计算日期并将其传递给查询,就会简单得多
SELECT name, birthday, birthday_date FROM user
WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me())
AND birthday_date != 'null'
AND birthday_date > '02/23/2013'
AND birthday_date < '04/24/2013'
ORDER BY birthday_date ASC
编辑#5
一些Java代码:
Calendar cal = Calendar.getInstance();
Date today = cal.getTime();
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
String today_formatted = formatter.format(today);
cal.add(Calendar.DATE, 30);
String today_plus30_formatted = formatter.format(cal.getTime());
String query =
"SELECT name, birthday, birthday_date FROM user
WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me())
AND birthday_date != 'null'
AND birthday_date > '" + today_formatted + "'
AND birthday_date < '" + today_plus30_formatted + "'
ORDER BY birthday_date ASC";
我没有测试过,没有安装 Java :-)
关于java - FQL 查询在接下来的 30 天内使用 Android 获取 Facebook friend 的生日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15037466/