MySQL中某日期的后一天表示方法

在MySQL中,如果想要表示某个日期(假设存储为DATE类型)的后一天,你可以使用DATE_ADD()函数或者通过加法操作符(+ INTERVAL)来实现。以下是两种方法的示例:

使用 DATE_ADD() 函数

SELECT DATE_ADD(your_date_column, INTERVAL 1 DAY) AS next_day  
FROM your_table;

使用 + INTERVAL

SELECT your_date_column + INTERVAL 1 DAY AS next_day  
FROM your_table;

两种方法都会返回your_date_column中每个日期值的后一天。

示例

在这里插入图片描述

官方解法

力扣官方解题方法很标准:力扣官方解题
首先,求出所有用户首次登录的第二天的时间。方法是查询出 Activity 表中每个用户的第一天时间,并加上 1。

select player_id, DATE_ADD(MIN(event_date), INTERVAL 1 DAY) as second_date
from Activity
group by player_id

将此表命名为 Expected。随后我们要从 Activity 表中查询 event_date 与 Expected.sencond_date 重叠的部分,注意此判定要限定在用户相同的前提下。这部分用户即为在首次登录后第二天也登录了的用户:

select Activity.player_id as player_id
  from (
    select player_id, DATE_ADD(MIN(event_date), INTERVAL 1 DAY) as second_date
    from Activity
    group by player_id
  ) as Expected, Activity
  where Activity.event_date = Expected.second_date and Activity.player_id = Expected.player_id

将此表命名为 Result。随后我们只需要得到 Result 表中用户的数量,以及 Activity 表中用户的数量,相除并保留两位小数即可。

select IFNULL(round(count(distinct(Result.player_id)) / count(distinct(Activity.player_id)), 2), 0) as fraction

将以上三步组合起来,得最终的查询:

select IFNULL(round(count(distinct(Result.player_id)) / count(distinct(Activity.player_id)), 2), 0) as fraction
from (
  select Activity.player_id as player_id
  from (
    select player_id, DATE_ADD(MIN(event_date), INTERVAL 1 DAY) as second_date
    from Activity
    group by player_id
  ) as Expected, Activity
  where Activity.event_date = Expected.second_date and Activity.player_id = Expected.player_id
) as Result, Activity

快速解法

大佬的更高效解法:高效解法

select round(avg(a.event_date is not null), 2) fraction
from 
    (select player_id, min(event_date) as login
    from activity #这个子查询为每个玩家找到最早的event_date(标记为login)
    group by player_id) p 
left join activity a 
on p.player_id=a.player_id and datediff(a.event_date, p.login)=1
#activity表中的event_date是login日期的后一天(使用datediff函数计算)

这个解法的精髓在于:

avg(a.event_date is not null) = sum(if(a.event_date is not null, 1, 0))/count(*)

avg(a.event_date is not null):它是一个布尔表达式,当a.event_date不为空时返回1,否则返回0。因此,这个平均值实际上是在计算满足连接条件的行数(即login日期的后一天有活动的玩家数)与所有玩家的比例。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值