从unix时间戳中选择最近的每月周年纪念日

时间:2013-02-05 00:33:22

标签: mysql unix-timestamp

我有一个在注册时插入Unix时间戳的应用程序。我想做的是计算自上个月周年纪念日以来的月份的使用情况详情。所以我需要一个unix时间戳,表示最近的周年纪念日。

例如,如果在1月5日提交注册,则客户的周年纪念日是第5天。因此,为了检查2月15日的使用情况,我需要从2月5日起检索日志中的所有条目。

轻松注册当天:

SELECT DATE_FORMAT(FROM_UNIXTIME(created), '%d') FROM  accounts

但是,根据注册日,我找不到上一个周年日的unix时间戳。我该怎么办?为了澄清,我希望返回在最近的周年纪念日或之后创建的所有action_id。

表:

accounts
+------------+------------+
| account_id | created    |
+------------+------------+
| 1          | 1321838910 |
+------------+------------+
....

logs
+------------+------------+------------+
| account_id | action_id  | created    |
+------------+------------+------------+
| 1          | 233        | 1348249244 |
+------------+------------+------------+
| 1          | 263        | 1348257653 |
+------------+------------+------------+
....

注意:为了简单起见,我将放弃查明如果周年纪念日是第31个例子会发生什么 - 也就是说,除非某人有超级忍者声明将这些事件考虑在内。

2 个答案:

答案 0 :(得分:2)

未经测试。看看你的想法。逻辑是:

  1. 获取当月的最后一天。
  2. 将创建的帐户天数添加到#1结果。
  3. 如果当前日期大于创建日期,则从#2结果中减去1个月。否则减去2个月。

  4. SELECT l.*
    FROM accounts a
    LEFT JOIN logs l
    ON a.account_id = l.account_id 
     AND l.created >= UNIX_TIMESTAMP(
      DATE_SUB(DATE_ADD(LAST_DAY(NOW()), INTERVAL DAY(FROM_UNIXTIME(a.created)) DAY),  
        INTERVAL IF(DAY(NOW()) > DAY(FROM_UNIXTIME(a.created)), 1, 2) MONTH));
    

    修改

    我更多地考虑了这个问题,也许下面的查询无论周年纪念日何时都会有效。我假设如果周年纪念日不在特定的月份,那么应该采取月份的最后一天。这很丑陋,但我加入一些变量使它更简洁,必须有一个更好的方法。无论如何,我没有测试但逻辑如下。

    1. 如果当天> anniversay day然后只是减去获得日期的天数差异。
    2. 如果上个月的最后一天少于周年纪念日,则使用上个月的最后一天。
    3. else从上个月的上一个日期减去周年纪念日和上个月的最后一天之间的日差。

    4. SELECT l.*
      FROM accounts a
      JOIN logs l
      ON a.account_id = l.account_id 
       AND l.created >= UNIX_TIMESTAMP(
         IF(@dNow := DAY(NOW()) >= @dCreated := DAY(FROM_UNIXTIME(a.created)),
           DATE_SUB(NOW(), INTERVAL @dNow - @dCreated DAY),
            IF(DAY(@endLastMonth := LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))) <= @dCreated, 
              @endLastMonth,
              DATE_SUB(@endLastMonth, INTERVAL DAY(@endLastMonth) - @dCreated DAY))));
      

答案 1 :(得分:0)

也许这会使用desc命令来获取最近创建的日期?

SELECT DATE_FORMAT(FROM_UNIXTIME(X.created), '%d') 
FROM  (
SELECT CREATED
FROM mytable
WHERE ACCOUNT_ID = ? -- customer id
AND DATE_DIFF(DATE_FORMAT(FROM_UNIXTIME(CREATED),'%Y-%m-%d'), NOW()) MOD 30 = 0 
AND DATE_DIFF(DATE_FORMAT(FROM_UNIXTIME(CREATED),'%Y-%m-%d'), NOW()) / 30 = 1
ORDER BY CREATED DESC LIMIT 1)X;