2014-11-20 72 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