我有一个在注册时插入Unix时间戳的应用程序。我想做的是,计算从上一个月的周年纪念日起一个月的使用详细信息。因此,我需要一个unix时间戳来记录最近的周年纪念日。
例如,如果在1月5日提交注册,则客户的周年纪念日是第5天。所以为了检查2月15日的使用情况,我需要从2月5日以来的日志中检索所有条目。
登记日期很容易获得:
SELECT DATE_FORMAT(FROM_UNIXTIME(created), '%d') FROM accounts
但是,我找不到基于注册日的上一个周年纪念日的unix时间戳。我该怎么做?为了澄清,我希望返回最近一个周年纪念日当天或之后创建的所有操作id。
桌子:
accounts
+------------+------------+
| account_id | created |
+------------+------------+
| 1 | 1321838910 |
+------------+------------+
....
logs
+------------+------------+------------+
| account_id | action_id | created |
+------------+------------+------------+
| 1 | 233 | 1348249244 |
+------------+------------+------------+
| 1 | 263 | 1348257653 |
+------------+------------+------------+
....
注意:为了简单起见,我将放弃计算如果一个周年纪念日是31号会发生什么,也就是说,除非有人有一个超级忍者的声明,考虑到这些事件。
最佳答案
没有测试。看看你怎么想。逻辑是:
获取当前月份的最后一天。
将帐户创建的天数添加到“1结果”。
如果当前日期大于创建日期,则从2结果中减去1个月。否则减去2个月。
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));
编辑
我对此做了更多的思考,也许下面的查询将起作用,而不管周年纪念日是什么时候。假设我认为如果周年纪念日不在某个月,则应取该月的最后一天。这很难看,但我加入了一些变量,使它更简洁,必须有一个更好的方法。不管怎样,我没有测试,但逻辑如下。
如果当前日期>周年纪念日,则只需减去日差即可获得日期。
否则,如果上个月的最后一天小于周年纪念日,则使用上个月的最后一天。
否则,从上个月的最后一天减去周年日和上个月的最后一天之间的日差。
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))));
关于mysql - 从Unix时间戳中选择最近的周年纪念日,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14698244/