首页 > 数据库技术 > 详细

MYSQL系列(4) 关于时间函数的一些写法

时间:2019-12-26 15:02:59      阅读:79      评论:0      收藏:0      [点我收藏+]

date_format(date, format) 函数用于以不同的格式显示日期/时间数据

参数

date: 合法的日期

format:规定的日期/时间的输出 格式

实例:下面是使用DATE_FORMAT()函数来显示不同的格式,我们使用NOW()来获得当前的日期/时间

date_format(now(), '%b %d %Y %h:%i %p')
date_format(now(), '%m-%d-%Y')
date_format(now(), '%d %b %y')

结果

 Dec 29 2008 11:45 pm
 12-29-2008
 29 Dec 08

date_sub(date, INTERVAL expr type) 函数从日期减去指定的时间间隔

参数:

date:合法的日期表达形式

expr:希望添加的时间间隔

type参数是下面

TYPE值(还有不常用的,具体查询书籍)
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR

实例

假设我们有下面表

OrderId ProductName OrderDate
1 ‘Computer‘ 2018-12-29 16:25:46.635

现在我们希望偶从order_date减去2天

select
        OrderId, Date_sub(Orderdate, INTERVAL 2 DAY) AS OrderPayDate
from
        Ordders
    
OrderId OrderPayDate
1 2008-12-27 16:25:46.635

3

now(), curdate(), curtime()

now() curdate() curtime()
2019-10-11 22:22:22 2019-10-11 22:22:22

可以看到curdate()取得是年月日,curtime()取得是时分秒

表table 再短 user_id, order_id, pay_time, order_time,order_amount

  1. 查询过去一个月的付款用户量最高的三天分别是哪天

  2. 查询昨天每个用户最后付款的订单ID及金额

    思路

    1.表的形式应该是

    day count
    2019-01-02 100
    2019-01-19 29
    2019-01-10 10
    1. 求出每天的用户数,每天,按照天进行分组
    2. 条件是过去一个月的付款用户,条件1:付款用户;条件2:过去一个月
    3. 对每天的数量进行排序求前三个
select 
        date_format(pay_time, '%Y-%M-%D') 'day', count(distinct user_id)
from 
        table
where
        order_amount > 0 and month(date_format(pay_time, '%Y-%m-%d')) =         month(now()) -1
group by  date_format(pay_time, '%Y-%m-%d')
order by  count(distinct user_id) desc limit 3;
  1. 思路

    1.所求表格

    user_id order_id order_amount
    xx xxx xxxx
    1. 对user_id进行分组,条件是昨天, 最后付款时间
select 
        user_id, order_id, order_amount
from
        table
where 
        date_format(pay_time, '%Y-%m-%d') = date_sub(curdate(), interval 1 day)
group by user_id;

二、有PV表a,字段 user_id, goods_id;点击表b 字段user_id, goods_id两表,各存放40亿条user_id的goods_id的访问记录,在防止数据倾斜的情况下,写出依据sql,找出两个表共同的user_id 和相应的goods_id

思路:这里数据倾斜指两个大表在关联的时候卡死的情况,空值解决方案

select
        * 
from
        a inner join b 
on a.user_id is not null and a.user_id = b.user_id
union all
select 
        *
from
        a
where
        a.user_id is null;
        

三、用户登录表 table 字段:user_id, log_time, session_id, plat

查询近30天,每天平均登录用户数量

思路:

  1. 要查询的表格

    avg_count()
    1. 每天的平均用户数量,对log_time进行分组
    2. 查出每一天的登录数量
    3. 求每天平均数量
select
        avg(t.day_count)
from
    (select date_format(log_time, '%Y-%M-%D'),count(user_id) as day_count
    from    table
     where date_format(log_time, '%Y-%m-%d') >= date_sub(curdate(), interval 30 day)
            and date_format(log_time, '%Y-%m-%d') <curdate()
    group by date_format(log_time, '%Y-%m-%d')
    ) t

四、对于通过不同渠道拉新进来的用户,经过一段时间可能会流失,而留下来的用户我们称之为留存用户。分析哟用户留存是拉新和用户运营的重要指标:

用户访问表:person_visit 字段:user_id(用户id), visit_date(访问时间), page_name(访问页面),plat(访问渠道)

  1. 统计近七天每天到访的新用户数

    思路:

    1. 要求的图表

      time count
      2019-10-1 100

      2.先以用户进行分组,求出每个用户在这七天最小的访问时间,条件是在最近7天内

      1. 再 以求出的这个最小访问时间分组,求出我们需要进行统计的每天访问用户数量
    select
         t.new_day, count(t.user_id)
    from
         (select user_id, min(date_format(visit_date, '%Y-%m-%d')) as new_day
            from person_visit
            where date_format(visit_date, '%Y-%m-%d') <= curdate()
                 and date_format(visit_date,'%Y-%m-%d') >= date_sub(curdate(), INTERVAL                      7 day)
             group by user_id
            ) t 
    group by t.new_day
  2. 统计每个渠道7天前的新用户的3日留和7日留存率

    1. 每个渠道7天前的新用户数

      表格形式

      plat count_new_user
      a 90

      新用户怎么求,以登录日期为条件过滤求出新用户数

      select 
            plat, count(distinct user_id)
      from 
            person_visit
      group by
            plat
      having 
            min(date_format(visit_date, '%Y-%m-%d')) = date_sub(curdate(), INTERVAL 7 day)
      
      1. 每个渠道3日留存用户数

        思路: id在7天前登录的用户里3日还登录的数目,用一个子查询来实现

        select  t.plat, count(distinct t.user_id) as '3日用户数'
        from  person_visit as t
        where user_id in (select plat, user_id
                           from person_visit
                           group by plat
                           having min(date_format(visit_date, '%Y-%m-%d')) =                           date_sub(curdate(), INTERVAL 7 day) )
        and date_format(t.visit_date, '%Y-%m-%d') = date_sub(curdate(), INTERVAL 4 day)
        group by t.plat;

        3.每个渠道7日留存用户数

        select t.plat, count(distinct t.user_id) as '7日用户数'
        from person_visit as t
        where user_id in (select plat, user_id
                          from person_visit
                          group by plat
                          having min(date_format(visit_date, '%Y-%m-%d')) =                             date_sub(curdate(), INTERVAL 7 day))
        and date_format(t.visit_date, '%Y-%m-%d') = date_sub(curdate(), Interval 7 day)
        group by t.plat;

MYSQL系列(4) 关于时间函数的一些写法

原文:https://www.cnblogs.com/yangjiez/p/12101745.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!