2014-11-20 75 views
1

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

打印机的配置页仅占用了总金额 - 无法从中获取当月的总金额。

我觉得我过度思考这个问题,但我想对此有其他想法。

所以这里的问题:如果我从strftime('%s','now')(Unix纪元)时间戳列表,我如何确定哪个日期是从本月最古老的一个?然后我想从当前日期中减去这个数字,看看我们是否超过了月度限制。

回答

-1

一个可能的解决方案是这样的:

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

这将让你在十一月打印的所有打印件。

编辑:对于您的情况:

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

将获得当月的用法。

+0

我调整你的代码,以我的表匹配,但我得到“没有这样的功能:NOW”当我尝试运行它。 (DATE_FORMAT(NOW(),'%​​Y-%m-01'))和UNIX_TIMESTAMP(NOW());''是我改变它为 – 2014-11-20 20:37:09

+0

在SQLite中无效。 – 2014-11-20 20:51:38

+0

明白了! '从日期('现在','开始月份')和日期('现在')日期之间的日期(日期,'unixepoch')选择*从打印机中选择*'做的窍门 - 感谢您的帮助! – 2014-11-20 20:59:36

0

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; 
+0

这看起来很完美,但我在理解什么都在做什么时遇到了一些麻烦。 [This](http://imgur.com/j9aTuHY)是我的桌子的样子 - 你可以修改它以适应它吗?对不起,如果这是要求太多(这是我第一次使用SQLLite,所以我对所有东西都是新手)。 – 2014-11-20 21:19:06

+0

我可以在通过打印机名称的for循环中使用它,然后使用WHERE语句将这些SELECT限制为特定名称。是这样的: 'SELECT(SELECT current_pages 从打印机 WHERE名称LIKE '%市区24楼 - 中央%' ORDER BY日期DESC LIMIT 1 ) - (SELECT current_pages 从打印机 WHERE日期 2014-11-20 21:28:05

+0

如果表格结构很重要,把它放到了问题中。 – 2014-11-21 07:45:02