使用Facebook开发人员文档中的information on FQL和the user table,我提出了以下代码。
//build fql string
$fql = "SELECT name, birthday_date FROM user
WHERE uid IN
(SELECT uid2 FROM friend WHERE uid1 = me())
AND strlen(birthday_date) != 0 AND substr(birthday_date,0,3)
IN ('{$currentMonth}/', '{$nextMonth}/')";
$fql.=$orderBy;
$fql.=" LIMIT " . $limit;
//query facebook
$params = array(
'method' => 'fql.query',
'query' => $fql,
'callback' => ''
);
$birthdays = $this->facebook_obj->api($params);
$currentMonth
和$nextMonth
分别设置为当前月份和下个月的字符串表示形式,格式为mm。 (例如“09”,“10”等)
这是“工作”,但是我们说今天是11月29日,我有11个朋友在11月生日,$limit
设置为10.在这种情况下,10很有可能它返回的生日将全部在11月29日之前。
我真正想做的是从今天开始,即本月和下一个即将到来的生日。我怎么能修改这个查询来实现呢?
谢谢!
* * 编辑,请参阅Shawn和I之间的评论帖子,了解可能的替代解决方案。没有接受答案,因为没有答案直接解决原始代码/问题。
答案 0 :(得分:9)
这已经晚了几个月,但也许可以帮助其他人面临同样的问题。基本上,FQL IN
运算符不检查值是否在给定范围内,而是检查给定值是否与提供的任何不同值匹配。在您的示例中,如果值为“09”和“10”,则返回9月和10月的所有生日,因为这些生日月份与提供的月份数相匹配。
您可以做的是使用PHP或您正在使用的任何其他语言计算以下值,并在您的FQL中使用它们(今天是3月17日,并说我们希望4月17日是结束日期):
确保分别使用dd和MM格式化日期和月份(在单个数字的情况下填充为零)。然后你的FQL看起来像这样:
SELECT name, birthday_date
FROM user
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
AND strlen(birthday_date) != 0
AND ((substr(birthday_date, 0, 2) = '03'
AND substr(birthday_date, 3, 5) >= '17')
OR (substr(birthday_date, 0, 2) = '04'
AND substr(birthday_date, 3, 5) < '17'))
ORDER BY birthday_date
这将返回3月17日至4月17日之间生日的朋友。
答案 1 :(得分:1)
AND created_time > strtotime('now') AND created_time < $endofnext
参考样本@ http://www.php.net/manual/en/function.strtotime.php#97025
使用“now”会返回当前的白天。
无论月份是什么月份,此功能都将返回下个月的最后一天。
<?php
/* $now can be set to any strtotime(), yesterday, last month, last year etc; */
$now = "now";
function EndOfNext($now){
function lastDayOfMonth($month = '', $year = '')
{
if (empty($month)) {
$month = date('m');
}
if (empty($year)) {
$year = date('Y');
}
$result = strtotime("{$year}-{$month}-01");
$result = strtotime('-1 second', strtotime('+1 month', $result));
return date('m/d/y', $result);
}
function addRealMonth($timeStamp)
{
$tempMonth = date('m', $timeStamp);
$tempYear = date('Y', $timeStamp);
if($tempMonth == "12")
{
$tempMonth = 1;
$tempYear++;
}
else
$tempMonth++;
$newDate = lastDayOfMonth($tempMonth, $tempYear);
return strtotime($newDate);
}
$newChargeDate = strtotime($now);
$newChargeDate = addRealMonth($newChargeDate);
return date("m/d/y", $newChargeDate);
}
$endofnext = EndOfNext($now);
echo $endofnext;
?>
答案 2 :(得分:0)
你也可以让FQL为你做一些工作,如下所示:
SELECT uid, name, birthday_date, strtotime(substr(birthday_date, 0, 5)) > now()
FROM user
WHERE uid in (SELECT uid2 FROM #freunde)
AND birthday_date <> ''
AND strpos(birthday_date,'06') = 0
ORDER BY substr(birthday_date, 0, 5)
返回一个布尔类型“anon”字段,告诉您是否必须将此结果包含在显示列表中(true),或者此用户的生日是否已经过去(false)。 不幸的是,我无法将这个命题作为一个WHERE子句 - 不断得到错误,但是我想知道是否有人比我幸运。
"error": {
"message": "Call to a member function on a non-object",
"type": "BadMethodCallException"
}