计算自月初以来的凭证总值

时间:2011-03-17 14:55:12

标签: php mysql sql

我有一个名为“代金券”的表,它包含名为“voucher_value”和“redeemed_at”的字段。 redeemed_at采用Unix时间戳格式(由PHP time()函数生成)。

所以我需要从月初开始获得总数voucher_value。

那是什么SQL代码?

感谢。

2 个答案:

答案 0 :(得分: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()
  • 的任何查询

答案 1 :(得分:1)

类似的东西:

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

也许