使用 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 来实现。
我正在尝试显示一周内排行榜的分数。
目前我使用以下查询某些每日分数:
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 来实现。