【问题标题】:How would I store a datetime, then compare the datetime against current datetime?我将如何存储日期时间,然后将日期时间与当前日期时间进行比较?
【发布时间】:2021-08-03 03:58:28
【问题描述】:

目前我正在获取 UTC 中不和谐消息的日期时间,然后将其添加到 xp_time 表下的数据库中。

我的困惑在于检索该日期时间,然后将其与当前日期时间进行比较,看看是否已经过了 60 秒。我尝试了一些不同的解决方案,但我无法弄清楚。

        db = sqlite3.connect('xpdata.db')
        cursor = db.cursor()

        user_id = int(msg.author.id)
        guild_id = msg.guild.id
        time_id = msg.created_at

        sqlupdate = (f'INSERT OR IGNORE INTO xpdata(user_id,guild_id, xp, level,xp_time) VALUES(?,?,?,?,?)')
        val = (user_id, guild_id, xp_inc, 0, time_id)
        cursor.execute(sqlupdate, val)
        db.commit()

下面是我有点困惑的地方,我想返回差异(如果可能的话)然后检查它是否超过 60 秒的差异,然后继续更新用户的 xp

我知道写错了!但这就是为什么我有这个问题哈哈。


        #Check for cooldown
        select = (f"SELECT julianday('now') - julianday(xp_time) FROM xpdata")
        cursor.execute(select)

        if select > 59:

            select = (f'SELECT * FROM xpdata WHERE user_id = {user_id} AND guild_id = {guild_id}')
            cursor.execute(select)
            for row in cursor.fetchall():
                xp_grab = row[2]
                lvl_grab = row[3]
[...]

【问题讨论】:

    标签: python sqlite datetime discord.py


    【解决方案1】:

    当使用 julianday 1 等于 1 天时,时间是小数部分。我建议使用可以使用 strftime('%s', time_value) 表示的时间(以秒为单位)。

    strftime 函数非常灵活,您可以使用strftime('%s','now','-59 seconds') 作为 59 秒前的时间。

    所以你可以使用:-

    如果您使用 julianday,则 1 是 1 天。我建议使用strftime('%s'),其中 1 是 1 秒。

    SELECT strftime('%s','now','-59 second') - strftime('%s',xp_time) FROM xpdata;

    示例

    CREATE TABLE IF NOT EXISTS xpdata (xp_time TEXT);
    INSERT INTO xpdata VALUES(datetime('now','-120 seconds')); /* inserts value 120 seconds ago */
    SELECT  strftime('%s','now') - strftime('%s',xp_time) FROM xpdata;
    

    以上结果:-

    其他注意事项

    或者你可以使用:-

    SELECT strftime('%s',xp_time) < strftime('%s','now','-59 seconds') FROM xpdata;

    这将返回 1(超过 59 秒为真)或 0(如果 59 秒或更短则为假)。

    当然,上面的内容可能会在选择中使用,甚至可以在没有事先检查的情况下进行更新(我想返回差异(如果可能的话)然后检查它是否超过 60 秒差异然后继续更新用户的xp)

    按照(如果 xp_time 超过 59 秒前,通过添加 10 个 xp 点来更新用户):-

    UPDATE xpdata SET xp = xp + 10 WHERE user_id = 1 AND guild_id = 1 AND strftime('%s',xp_time) < strftime('%s','now','-59 seconds');
    

    您不妨考虑阅读SQLite Date and Time Functions

    【讨论】:

    • 这是我遇到过的最复杂的事情。谢谢你的解释!
    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2022-01-16
    • 2019-09-26
    • 2014-05-03
    • 2014-08-29
    • 2013-01-16
    相关资源
    最近更新 更多