LIKE和BETWEEN查询SQL与Haxe

时间:2016-11-26 23:18:01

标签: mysql sql sql-like haxe between

我试图在一周内显示排行榜的分数。

目前,我通过以下方式查询某些日常分数:

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

1 个答案:

答案 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的情况下实现。