2011-03-17 52 views
2

我有一張名爲「代金券」的表,它包含名爲「voucher_value」和「redeemed_at」的字段。 redeemed_at採用Unix時間戳格式(由PHP time()函數生成)。從月初開始計算代金券總值

所以我需要從月初開始獲得voucher_value的總數。

這是什麼SQL代碼?

謝謝。

回答

1

類似:

SELECT SUM(voucher_value) 
    FROM vouchers 
WHERE MONTH(FROM_UNIXTIME(redeemed_at)) = MONTH(CURDATE()) 
    AND YEAR(FROM_UNIXTIME(redeemed_at)) = YEAR(CURDATE()) 

也許

+0

但也許不同年代過濾掉數據?另外,你不應該先FROM_UNIXTIME(redeemed_at)嗎? – Unreason 2011-03-17 15:05:02

+0

@unreason - 不錯,補充說,謝謝 – 2011-03-17 15:06:42

3

我相信,你會發現所有您在docs需要的日期和時間函數。

編輯

馬克的答案是非常好的。如果你正在追逐性能的最後一滴,你的列類型是timestamp(手錶區和範圍的限制),你必須再上一個索引:

SELECT SUM(voucher_value) 
FROM vouchers 
WHERE redeemed_at BETWEEN 
     UNIX_TIMESTAMP(DATE_ADD(LAST_DAY(DATE_SUB(NOW(), interval 1 month)), interval 1 day)) 
     AND 
     UNIX_TIMESTAMP(DATE_SUB(DATE_ADD(LAST_DAY(NOW()), interval 1 day), interval 1 second)) 

要快很多(因爲它不會有申請任何轉換到redeemed_at。表達式是大/複雜的(並且沒有經過徹底測試,它可以寫得更簡單/更短),但重要的是它們是常量並且每個查詢只計算一次。 NOW()用參數獲得兩件東西

  • 泛化(當然)
  • 能力緩存結果(MySQL不會緩存涉及NOW()任何疑問)
+0

+1優化編輯 – 2011-03-17 16:41:59