统计本周的订单数,统计最近7天的订单数

3个函数

DATE_SUB和SUBDATE在MySQL中的作用是一样的,它们都是用于执行日期的减法运算。具体来说,这两个函数都允许你从给定的日期或日期时间值中减去一个指定的时间间隔,然后返回一个新的日期或日期时间值。

DATE函数

DATE(time) 用于获取当前字段的日期 2024-09-26

DATE_SUB函数

DATE_SUB函数的基本语法如下:

DATE_SUB(date, INTERVAL expr type)
  • date:是一个日期或日期时间表达式,表示起始日期。
  • INTERVAL:是MySQL中的关键字,用于指示接下来的部分是一个时间间隔。
  • expr:是一个数值表达式,表示要减去的时间间隔的数量。
  • type:是时间间隔的单位,如YEAR、MONTH、DAY、HOUR等。

这个函数允许你根据需要,在日期或日期时间字段中减去年、月、日、小时、分钟或秒钟等时间单位。

SUBDATE函数

SUBDATE函数的语法与DATE_SUB函数非常相似,也用于执行日期的减法运算:

SUBDATE(date, INTERVAL expr unit)
  • date:同样表示起始日期。
  • INTERVAL:也是指示时间间隔的关键字。
  • expr:表示要减去的时间间隔的数量,可以是数字、表达式或函数。
  • unit:是时间间隔的单位,如DAY、MONTH等。

SUBDATE函数的具体用法与DATE_SUB非常接近,都允许你从给定的日期中减去指定的时间间隔。



订单表建表语句(只需关注checkout_time) 

-- auto-generated definition
create table orders
(
  id                   varchar(32)    default ''     not null comment '主键-订单号'
  primary key,
  status               int            default 1      not null comment '订单状态 1待付款,2待接单,3待派送,4待取餐,5已派送,6已完成,7已取消,8外卖待审批,9堂食待审批',
  member_id            varchar(32)    default ''     not null comment '下单用户',
  address_book_id      varchar(32)    default ''     not null comment '地址id',
  order_time           datetime                      null comment '下单时间',
  shop_id              varchar(32)    default ''     not null comment '所属店铺',
  checkout_time        datetime                      null comment '结账时间',
  pay_method           int            default 1      not null comment '支付方式 1微信,2支付宝',
  pickup_code          varchar(16)    default '0000' not null comment '取餐码(四位数)',
  amount               decimal(10, 2) default 0.00   not null comment '实收金额',
  remark               varchar(100)   default ''     not null comment '备注',
  phone                varchar(13)    default ''     not null comment '收件人手机号',
  address              varchar(255)   default ''     not null comment '收件地址',
  consignee            varchar(255)   default ''     not null comment '收货人姓名',
  type                 varchar(1)     default '1'    not null comment '0-外卖 1-堂食',
  cancel_reason        varchar(32)    default ''     not null comment '取消下单原因(管理端)',
  cancel_reason_member varchar(32)    default ''     not null comment '取消下单原因',
  reject_cancel_reason varchar(32)    default ''     not null comment '商家拒绝用户取消下单的原因',
  rejection_reason     varchar(32)    default ''     not null comment '拒单原因(管理端)'
)
    comment '订单表';

统计最近7天的订单数

SELECT CURRENT_DATE();

2024-09-26


SELECT DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY);

2024-09-19

  • DATE_SUB是MySQL中的一个日期函数,用于从当前日期(CURRENT_DATE())减去一个时间间隔。
  • DATE_SUB()函数接受两个参数:第一个参数是要被减去时间间隔的日期,第二个参数是要减去的时间间隔。
  • 在这个例子中,时间间隔是INTERVAL 7 DAY,表示7天。
  • 因此,DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)计算的是当前日期之前的7天(即7天前的日期)。


SELECT *  
FROM orders  
WHERE checkout_time BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND CURRENT_DATE();



统计本周的订单数

周几

周一

周二

周三

周四

周五

周六

周日

WEEKDAY(CURRENT_DATE())的值

0

1

2

3

4

5

6


SELECT WEEKDAY(CURRENT_DATE()) today_value;

SELECT WEEKDAY(SUBDATE(CURRENT_DATE(),INTERVAL 4 DAY)) today_minus_4day_value;



情况1:周一为一周的开始

周一到今天 

SELECT *  
FROM orders  
WHERE DATE(checkout_time) BETWEEN  
    -- 本周的第一天(周一)  
    SUBDATE(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)  
    -- 今天  
    AND DATE(CURDATE());

完整的一周(周一到周日) 

SELECT *  
FROM orders  
WHERE DATE(checkout_time) BETWEEN  
    -- 本周的第一天(周一)  
    SUBDATE(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)  
    -- 本周的最后一天(周日)  
    AND SUBDATE(CURDATE(), WEEKDAY(CURDATE()) - 6);

情况2:周日为一周的开始

周日到今天 

SELECT *  
FROM orders  
WHERE 
-- 情况1 今天非周日 则需要包括今天到上个周日
(WEEKDAY(CURDATE())!=6 AND DATE(checkout_time) 
BETWEEN  
    -- 本周的第一天(上个周日,如果今天是周日的话只有今天一天,即下面那种情况)  
    SUBDATE(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)  
    -- 今天  
    AND DATE(CURDATE())
)
OR
-- 情况2 今天是周日 即只有今天一天
(WEEKDAY(CURDATE())=6 and DATE(checkout_time)=DATE(CURDATE()));

完整的一周(周日到周六) 

SELECT *  
FROM orders  
WHERE 
-- 情况1 今天非周日 则需要包括今天到上个周日
(WEEKDAY(CURDATE())!=6 AND DATE(checkout_time) 
BETWEEN  
    -- 本周的第一天(上个周日,如果今天是周日的话只有今天一天,即下面那种情况)  
    SUBDATE(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)  
    -- 本周的最后一天(这周六)  
    AND SUBDATE(CURDATE(),INTERVAL (WEEKDAY(CURDATE()) - 5) DAY)
)
OR
-- 情况2 今天是周日 即只有今天一天
(WEEKDAY(CURDATE())=6 and DATE(checkout_time)=DATE(CURDATE()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值