【问题标题】:Find Oldest Date in Current Month from List of Dates从日期列表中查找当前月份中最旧的日期
【发布时间】:2014-11-20 19:51:11
【问题描述】:

背景:我正在用 Python 编写一个脚本来帮助管理我公司的纸张使用情况。我只是废弃了打印机配置页面并将每台打印机消耗的总纸张量存储在 SQL 数据库中。在我们收取额外费用之前,我们租用打印机的公司每个月都会给我们一个限制,所以我想在/如果我们超过这个限制时提醒自己和我的经理。

打印机的配置页面只有消耗的总金额 - 无法从中获取当月的总金额。

我觉得我在想这个问题,但我想对此有一些其他的想法。

那么问题来了:如果我有一个来自strftime('%s','now')(unix 纪元)的时间戳列表,我将如何确定哪个日期是当前月份中最旧的日期?然后我想从当前日期中减去它,看看我们是否超过了每月的限制。

【问题讨论】:

    标签: python sql sqlite date web-scraping


    【解决方案1】:

    SQLite 的 date functions 有一个 start of month 修饰符;将其用作过滤器。

    要获取这些日期中的最新日期,请按日期排序,然后取第一个:

    SELECT name,
           (SELECT current_pages
            FROM printers
            WHERE name = names.name
            ORDER BY timestamp DESC
            LIMIT 1
           ) -
           (SELECT current_pages
            FROM printers
            WHERE name = names.name
              AND timestamp < CAST(strftime('%s', 'now', 'start of month') AS INTEGER)
            ORDER BY timestamp DESC
            LIMIT 1
           ) AS this_month_pages
    FROM (SELECT DISTINCT name
          FROM printers) AS names;
    

    【讨论】:

    • 这看起来很完美,但我在理解所有内容时遇到了一些麻烦。 This 是我的桌子的样子 - 你可以修改它来使用它吗?对不起,如果这要求太多(这是我第一次使用 SQLLite,所以我对一切都很陌生)。
    • 我可以在遍历打印机名称的 for 循环中使用它,然后使用 WHERE 语句将这些 SELECT 限制为特定名称.. 类似于:SELECT (SELECT current_pages FROM printers WHERE name like '%Downtown 24th Floor - Center%' ORDER BY date DESC LIMIT 1 ) - (SELECT current_pages FROM printers WHERE date &lt; CAST(strftime('%s', 'now', 'start of month') AS INTEGER) AND WHERE name like '%Downtown 24th Floor - Center%' ORDER BY date DESC LIMIT 1 ) AS ThisMonthAmount;
    • 如果表结构很重要,请提出问题。
    【解决方案2】:

    一种可能的解决方案是:

    SELECT *
    FROM prints
    where prints.timestamp between UNIX_TIMESTAMP("2014-11-01") and UNIX_TIMESTAMP("2014-12-01");
    

    这将为您提供 11 月打印的所有照片。

    编辑:对于你的情况:

    SELECT *
    FROM prints
    where prints.timestamp between UNIX_TIMESTAMP(DATE_FORMAT(NOW() ,'%Y-%m-01')) and UNIX_TIMESTAMP(NOW());
    

    这将获得当前月份的使用情况。

    【讨论】:

    • 我调整了您的代码以匹配我的表格,但是当我尝试运行它时,我得到“没有这样的功能:现在”。 SELECT * FROM printers where printers.date between UNIX_TIMESTAMP(DATE_FORMAT(NOW() ,'%Y-%m-01')) and UNIX_TIMESTAMP(NOW()); 是我改成的
    • 这在 SQLite 中无效。
    • 知道了! select * from printers where DATE(date, 'unixepoch') between date('now','start of month') and date('now') ORDER by date; 成功了 - 感谢您的帮助!
    • 实际上我认为没有用...仍在弄清楚
    • Matt T 您需要将日期转换为 UNIX。我不知道 sqlite 但类似: select * from printers where DATE(date, 'unixepoch') between strftime('%s',date('now','start of month')) 和 strftime('%s', 'now') 按日期排序; ;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多