好吧,首先,请务必征得friends_birthday
许可,否则您将无法获得朋友的生日日期。
如果您不熟悉Graph API Explorer,您应该 - 您可以测试 FQL 查询以发现问题。
单击“获取访问令牌”并在“朋友数据权限”中检查“friends_birthday”,您就可以开始测试查询了。
其次,所有的生日都与实际出生年份一起存储,因此above today
在 FQL 查询中询问将始终不返回任何内容。“修复”日期 - 您实际上可以选择生日和今年的一部分,如下所示:
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。我的猜测是你必须让你所有的朋友生日并使用 JAVA 过滤数据——这应该很容易,因为自定义选择字段中的日期是 2013 年而不是实际年份。
随意使用此链接测试FQL。
编辑#1
我想澄清一些事情,您希望转换的原始查询不会
获取未来 30 天内那些生日的 Facebook 好友列表
在查询中手动替换值时,我看到它返回同一个月内 2 天之间生日的所有朋友。它不会找到在接下来的 30 天内过生日的所有朋友。
编辑#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')
这应该变得更容易遍历列表并过滤今天之前的列表,并且从今天起不超过 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 :-)