我试图在一周内显示排行榜的分数。
目前,我通过以下方式查询某些日常分数:
public static function displayDay(day:String)
{
queryLeaderboard("SELECT * FROM gamedata WHERE ts LIKE '%-" + day + "%' ORDER by scoreDifference DESC LIMIT 10");
}
这将显示我的时间戳的分数,格式为2016-11-25 20:04:47因此在事后找到“ - ”之后的东西。我的每年,每月和每日得分都很好。
但是,我试图找到每周分数。
我目前有以下内容:
public static function displayWeek()
{
var dateNow:Date = Date.now();
Lib.print(dateNow);
Lib.print("<br>");
Lib.print(dateNow.getDate());
Lib.print("<br>");
var weekAgo:Int = dateNow.getDate() - 7;
Lib.print(weekAgo);
Lib.print("<br>");
var query:String = "SELECT * FROM gamedata WHERE ts BETWEEN LIKE '%-" + weekAgo + "%' AND LIKE '%-" + dateNow.getDate() + "%' ORDER by scoreDifference DESC LIMIT 10";
Lib.print(query);
queryLeaderboard(query);
}
查询如下:
SELECT * FROM gamedata WHERE ts BETWEEN LIKE '%-19%' AND LIKE '%-26%' ORDER by scoreDifference DESC LIMIT 10
根据我对SQL查询的理解(有限),它不喜欢尝试在字符串之间找到彼此之间的值?但我相信格式是来自Haxe的SDateTime。
我该怎么做?
class GameData extends Object
{
public var id:SId;
public var username:SString<32>;
public var countryA2:SString<32>;
public var scoreFor:SInt;
public var scoreAgainst:SInt;
public var scoreDifference:SInt;
public var ts:SDateTime;
}
答案 0 :(得分:2)
尝试使用这样的SQL:
...
var query:String = "SELECT * FROM gamedata WHERE ts
BETWEEN '" + Date.fromTime(dateNow.getTime()-7*24*3600*1000).toString() + "'
AND '" + dateNow.toString() + "'
ORDER by scoreDifference DESC LIMIT 10";
Lib.print(query);
queryLeaderboard(query);
...
在MySQL中,如果使用BETWEEN函数,则必须至少传递数据对象的字符串表示形式。如果这样做,则不再需要LIKE。此外,如果你看看getDate() - 它返回Int,所以如果你从星期一(1)减去7你得到-6。相反,我建议从转换为时间戳表示的当前时间减去7 * 24 * 3600秒。
查看Haxe文档API.HAXE.ORG/DATE
我希望这可以提供帮助。
修改强>
getTime()取决于平台具有每秒(不是毫秒)的精度。这就是为什么上述答案可以在有或没有乘以1000的情况下实现。