我有一張名爲「代金券」的表,它包含名爲「voucher_value」和「redeemed_at」的字段。 redeemed_at採用Unix時間戳格式(由PHP time()函數生成)。從月初開始計算代金券總值
所以我需要從月初開始獲得voucher_value的總數。
這是什麼SQL代碼?
謝謝。
我有一張名爲「代金券」的表,它包含名爲「voucher_value」和「redeemed_at」的字段。 redeemed_at採用Unix時間戳格式(由PHP time()函數生成)。從月初開始計算代金券總值
所以我需要從月初開始獲得voucher_value的總數。
這是什麼SQL代碼?
謝謝。
類似:
SELECT SUM(voucher_value)
FROM vouchers
WHERE MONTH(FROM_UNIXTIME(redeemed_at)) = MONTH(CURDATE())
AND YEAR(FROM_UNIXTIME(redeemed_at)) = YEAR(CURDATE())
也許
我相信,你會發現所有您在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()
用參數獲得兩件東西
NOW()
任何疑問)+1優化編輯 – 2011-03-17 16:41:59
但也許不同年代過濾掉數據?另外,你不應該先FROM_UNIXTIME(redeemed_at)嗎? – Unreason 2011-03-17 15:05:02
@unreason - 不錯,補充說,謝謝 – 2011-03-17 15:06:42