SQLITE3 更新案例 Node.js

SQLITE3 UPDATE CASE Node.js

我正在为 node.js 使用 sqllite3 npm,我想执行以下操作:

一个玩家可以玩10次游戏。 24 小时后计数器重置,他可以再次玩 10 场比赛。我的想法是用更新案例来做。

 db.run("UPDATE user_sessions SET games_played = CASE WHEN((CAST(strftime('%s', CURRENT_TIMESTAMP) as integer) - CAST(strftime('%s', last_game) as integer))>86400 THEN "1" ELSE  ?1, last_game = CURRENT_TIMESTAMP WHERE ip_address = ?2 AND user_agent = ?3", {
        1:gamesPlayed,
        2:handshake.address,
        3:handshake.headers['user-agent']
    });

如果上一场比赛与现在相差 24 小时(86400 秒),他会更新并设置计数器 1。

(CAST(strftime('%s', CURRENT_TIMESTAMP) as integer) - CAST(strftime('%s', last_game) as integer)

应该以秒为单位给出时差。这个对我有用。

完整的声明对我不起作用,它说: "THEN" 附近的错误:语法错误

这种更新语句可以吗?如果是,我做错了什么?

我也在 sqlite 浏览器命令行中尝试过这个:

UPDATE user_sessions SET games_played = CASE WHEN(((CAST(strftime('%s', CURRENT_TIMESTAMP) as integer) - CAST(strftime('%s', last_game) as integer))>86400) THEN 1 ELSE  5, last_game = CURRENT_TIMESTAMP 

同样的错误。

您在第一个 cast 之前有一个多余的 (,并且缺少 case 表达式的 end 子句:

UPDATE user_sessions SET games_played = CASE WHEN(CAST(strftime('%s', CURRENT_TIMESTAMP) as integer) - CAST(strftime('%s', last_game) as integer))>86400 THEN "1" ELSE  ?1 END, last_game = CURRENT_TIMESTAMP WHERE ip_address = ?2 AND user_agent = ?3"