我有一个在注册时插入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个例子会发生什么 - 也就是说,除非某人有超级忍者声明将这些事件考虑在内。
答案 0 :(得分: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))));
答案 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;