一、问题描述:
一条订单的记录中有用车的起始时间,现在需要查询一段时间内,每天具体有几个订单。如:一个订单的用车时间为10月1号至10月5号,此时需查询出5条记录:
二、解决方案:
步骤
建表sqldrop table if exists charter_order_header;
( id int unsigned not null auto_increment comment 'ID', unit_id varchar(64) comment '单位ID', unit_name varchar(100) comment '单位名称', department_id varchar(64) comment '部门ID, 保留', department varchar(100) comment '部门名称', order_number char(11) comment '订单编号, 编号规则: yyMMdd + <5位流水号>, 5位流水号从 00001 始,至 99999 止, 编号全数字, 如 16102400002. 单位ID + 订单编号 构成唯一键', business_type int comment '业务类型, 1 = 包车,2 = 通勤', customer_id varchar(64) comment '客户ID', customer_name varchar(100) comment '客户名称', customer_type int comment '客户类型, 1 = 个人客户,2 = 单位客户', customer_identifier varchar(100) comment '客户证件号, 个人客户为身份证号,单位客户为统一社会信用代码', customer_grade int comment '(客户)会员级别, 1 = 普通会员,2 = 签约会员', contact_id varchar(64) comment '联系人ID', contact_name varchar(50) comment '联系人姓名', phone_number varchar(100) comment '客户/联系人电话', charter_area_scope int comment '包车(区域)类型, 1 = 县内包车,2 = 县际包车,3 = 省际包车', charter_begin_time datetime comment '用车时间起', charter_end_time datetime comment '用车时间止', charter_begin_date date comment '用车日期起, 同用车时间起的日期', charter_end_date date comment '用车日期止, 同用车时间止的日期', duration float comment '用车时长', route_id varchar(64) comment '线路ID', route_name varchar(100) comment '线路名称', route_start_place varchar(50) comment '线路起点', start_area_code varchar(10) comment '起点所属行政区划代码, 实际长度为6, 全数字, 对应码表类型 admin_area_code', start_area_name varchar(50) comment '起点所属行政区划名称', route_end_place varchar(50) comment '线路终点', end_area_code varchar(10) comment '终点所属行政区划代码', end_area_name varchar(50) comment '终点所属行政区划名称', roads_passed varchar(200) comment '途经路线', big_sites_of_route varchar(200) comment '主要停靠地', route_kms_estimated float comment '线路预估里程', highway_kms_estimated float comment '高速里程, 线路预估里程中的高速里程数', number_of_passengers int comment '乘车人数', is_return_trip bit comment '是否往返载客, true = 返程载客, false = 单程', is_multiple_locations bit comment '是否多点接送客, true = 是, false = 否', pickup_locations varchar(200) comment '接客地点, 多个地点用逗号分隔', destination varchar(200) comment '送客目的地', return_destinations varchar(200) comment '送客返程目的地, 多个地点用逗号分隔', is_salary_talked bit comment '驾驶员协议趟次工资, true = 协议工资方式, false = 非协议工资方式', bus_types varchar(200) comment '车型列表, 逗号分隔的车型名称列表', bus_count int comment '车辆数', is_driver_appointed bit comment '是否指定驾驶员, true = 指定, false = 未指定', price_type int comment '价格类型, 1 = 全包,2 = 半包', charge_type int comment '计价方式, 若业务类型为包车, 取值: 1 = 总价,2 = 趟次价,3 = 日计价,4 = 人数计价; 若业务类型为通勤, 取值: 5 = 固定趟次价, 6 = 月总价分摊', bus_unit_price float comment '车辆单价', is_contract_signed bit comment '是否已签包车合同, true = 是, false = 否', total_amount float comment '(本次)包车总费用, 指订单价', shuttle_quote_id varchar(64) comment '关联通勤签约价ID, 关联包车签约价表ID, 通勤的月总价方式有效', shuttle_month_price float comment '(通勤)月总价, 通勤的月总价方式有效', deposit_amount float comment '订金额', is_invoice_needed bit comment '需开发票, true = 需要,false = 不需要', invoice_info_id varchar(64) comment '发票信息ID, 关联包车发票开票信息表ID, 可为空', invoice_making_method int comment '开票方式, 1 = 单趟单开,2 = 统一开票. 需开发票为 true 时有效', invoice_delivery_type int comment '发票交付方式, 1 = 随车交付,2 = 邮寄. 需开发票为 true 时有效', invoice_buyer_name varchar(100) comment '发票收票单位, 即发票抬头. 需开发票为 true 时有效', mail_address varchar(100) comment '邮寄地址. 需开发票为 true 时有效', post_code varchar(20) comment '邮编. 需开发票为 true 时有效', recipient varchar(50) comment '收件人. 需开发票为 true 时有效', order_source int comment '订单来源, 1 = 门店下单,2 = 电话下单,3 = QQ下单,4 = 其他来源', order_accepter_id varchar(64) comment '接单人ID', order_accepter_name varchar(50) comment '接单人姓名', ordering_time datetime comment '下单时间', remarks varchar(500) comment '其他备注', order_status int not null default 0 comment '订单状态, 0 = 编辑, 及其它', cancel_reason varchar(200) comment '订单取消原因, 订单状态为取消时有效', cancel_notification int default 0 comment '订单取消通知状态, 0 = 不通知, 1 = 待通知, 2 = 已通知', plate_status int comment '包车牌状态, 0 = 未办, 1 = 已办(该订单的全部车辆都办理包车牌后更新为已办)', settlement_accounting_date date comment '结算记账日期, 指结算时记入订单账目的日期', settlement_type varchar(50) comment '结算类型', settlement_days float comment '结算天数', settlement_number_of_passengers int comment '结算乘车人数', settlement_order_amount float comment '结算价, 指订单的实际执行价', settlement_amount_receivable float comment '订单应收', settlement_remarks varchar(500) comment '备注', settlement_person_id varchar(64) comment '结算人ID', settlement_person_name varchar(50) comment '结算人姓名', settlement_time datetime comment '结算时间, 即进行结算操作的时间', invoice_made int not null default 0 comment '开票状态, 0 = 未开票, 1 = 部分开票, 2 = (全部)已开票', collection_status int not null default 0 comment '收款状态, 0 = 未收, 1 = 未结清, 10 = 全款已收', del_flag char default '0' comment '注销标识, ''0'' = 正常, ''1'' = 删除', create_id varchar(64) comment '登记人ID', create_by varchar(30) comment '登记人姓名', create_date datetime comment '登记时间', update_id varchar(64) comment '最后修改人ID', update_by varchar(30) comment '最后修改人姓名', update_date datetime comment '最后修改时间', primary key (id), unique key AK_UNIT_ORDER_NUMBER (unit_id, order_number), key AK_CHARTER_OH_ORDER_STATUS (order_status) );create table charter_order_header
alter table charter_order_header comment '包车订单头';
2. 查询10月1号至10月5号之间的具体日期`drop procedure if exists select_dates;create procedure select_dates( startTime date)begindrop table if exists tmp_daily_plan; create TEMPORARY table tmp_daily_plan (plan_date date);set @stop=date_add(startTime,INTERVAL 7 day);while startTime <= @stop DOinsert into tmp_daily_plan values(startTime);set startTime=date_add(startTime,interval 1 day);end while;end;`
3. 查询一段时间内每天的订单数
` drop procedure if exists select_transport_capacity;
date,planDateFrom date, planDateTo date, unitId varchar(100)) begin drop table if exists tmp_daily_plan; create TEMPORARY table tmp_daily_plan (plan_date date); set @stop=date_add(planDateTo,INTERVAL 7 day); while planDateTo <= @stop DO insert into tmp_daily_plan values(planDateTo); set planDateTo=date_add(planDateTo,interval 1 day); END while; select h.plan_date as planDate,IFNULL(h.orderCount,0) AS ```orderCount , IFNULL(h.busCount,0) AS busCount,IFNULL(k.idelCount,0) AS idelCount, IFNULL(k.tripLineCount,0) AS tripLineCount , IFNULL(k.charterCount,0) AS charterCount, IFNULL(k.maintenanceCount,0) AS maintenanceCount FROM -- 查询当天包车订单数量、包车车辆需求数量 (SELECT COUNT(DISTINCT(id)) as orderCount,sum(bus_COUNT) as busCount,plan_date FROM -- 订单头连接日期表,查询出一段日期范围内的订单数据,同一订单有多天用车时间时会查询出用车时间日期内的多条订单记录 (SELECT * FROM ( SELECT o.id, `o.bus_COUNT,o.charter_begin_date,o.charter_end_date,o.unit_id,p.plan_date FROM charter_order_header o ,tmp_daily_plan p WHERE `o.charter_begin_date BETWEEN planDateFrom AND planDateTo WHERE s.plan_date BETWEEN s. charter_begin_date AND GROUP BY t.plan_date)h left JOIN -- 查询包车已调、班线已调车辆、维护车辆、已调车辆 (SELECT COUNT(CASE is_idle WHEN 0 THEN null ELSE is_idle END) AS idelCount, COUNT(CASE tripline_task_COUNT WHEN 0 THEN NULL ELSE tripline_task_COUNT END) AS tripLineCount, COUNT(CASE charter_task_COUNT WHEN 0 THEN NULL ELSE charter_task_COUNT END) AS charterCount, COUNT(CASE maintenance_task_COUNT WHEN 0 THEN NULL ELSE maintenance_task_COUNT END) AS maintenanceCount, plan_date FROM sched_bus_daily_plan WHERE plan_date >= planDateFrom AND plan_date <= planDateTo GROUP BY plan_date)k on k.plan_date = h.plan_date; END; call select_transport_capacity('-12-12','-12-12','-12-16','e398e88bbe314b1b9195a117a9585a1f')` create procedure select_transport_capacity( planDateTo
AND o.unit_id=unitId)s
s.charter_end_date)t`