簡體   English   中英

FQL查詢使用Android在未來30天內獲得Facebook好友生日

[英]FQL Query to get Facebook Friends Birthdays in next 30 days using Android

我正在編寫Android應用程序,其中我通過使用以下代碼獲取當月那些生日朋友列表

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";

但現在我想在接下來的30天內獲取Facebook朋友的那些生日列表 ,我知道使用下面的當前日期獲得接下來30天java代碼

    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權限,沒有它你就不能得到朋友的生日日期。

如果您不熟悉Graph API Explorer ,則應該 - 您可以測試FQL查詢以查找問題。

單擊“獲取訪問令牌”,然后在“朋友數據權限”中選中“friends_birthday”,您就可以開始測試查詢了。

其次,所有的生日都與實際的出生年份一起存儲,因此above today在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。 我的猜測是你必須讓所有朋友過生日並使用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 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM