使用 Haxe 进行 LIKE 和 BETWEEN 查询 SQL

LIKE and BETWEEN query SQL with Haxe

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

目前我使用以下查询某些每日分数:

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

尝试使用这样的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() - 它 returns Int 所以如果您从星期一 (1) 中减去 7,您将得到 -6。相反,我建议从转换为时间戳表示的当前时间减去 7*24*3600 秒。

看看 Haxe 文档 API.HAXE.ORG/DATE

希望对您有所帮助。

编辑
取决于平台的 getTime() 具有每秒(不是毫秒)的精度。这就是为什么上面的答案可以乘以或不乘以 1000 来实现。