MySQL从5.1.5开始,支持XML接口处理的两个函数: ExtractValue()和 UpdateXML().
需求:编写停车计费算法:
输入:Express Text(XML), BeginTime DateTime, EndTime DateTime;
输出:Decimal(10,2)-计费金额
计费分起步价和累计计费,分多个时段处理。 如果起步价跨越多个时段,则以第一个时段的价格为准。
<?xml version="1.0" encoding="utf-8"?>
<ChargeExpress>
<FreeCycle Unit="min" >15</FreeCycle>
<ChargeCycle ID="peaktime" BeginTime="8:00:00" EndTime="20:00:00" >
<MinFee Cycle="120" ChargeFee="0.08" ></MinFee>
<NormalFee ChargeCycle="30" ChargeFee="0.04"></NormalFee>
</ChargeCycle>
<ChargeCycle ID="offpeaktime" BeginTime="20:00:00" EndTime="8:00:00" >
<MinFee Cycle="120" ChargeFee="0.04" ></MinFee>
<NormalFee ChargeCycle="30" ChargeFee="0.02"></NormalFee>
</ChargeCycle>
</ChargeExpress
MySQL Function:
CREATE FUNCTION `f_parking_meter`(`charge_scheme` text,`begin_time` datetime,`end_time` datetime) RETURNS decimal(10,2)
BEGIN
set @result=0.00;
set @parking_min=(UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(begin_time)) /60;
set @str_free_scheme_min=ExtractValue(charge_scheme, '/ChargeExpress/FreeCycle');
set @free_scheme_min=CAST(@str_free_scheme_min as UNSIGNED);
IF @parking_min <= @free_scheme_min THEN
RETURN @result;
END IF;
-- 总的计费方案节点数
set @total_chargecycle_node=ExtractValue(charge_scheme, 'count(/ChargeExpress/ChargeCycle/NormalFee)');
set @present_date=date(begin_time);
-- 是否正在计算起步价(1是,0否)
set @is_starting_price=1;
-- 起步价已经跨越到下个计费时段(这里假定最多跨越2个,不会再跨越到第三个时段
set @is_cross_period_starting_price = 0;
set @is_done=0;
while not @is_done do
set @currentNodeCounter=0;
while @currentNodeCounter < @total_chargecycle_node do
set @currentNodeCounter=@currentNodeCounter+1;
set @nodeInfo = concat('/ChargeExpress[1]/ChargeCycle[',@currentNodeCounter,']');
set @node_begin_time=ExtractValue(charge_scheme, concat(@nodeInfo,'/@BeginTime'));
set @node_end_time=ExtractValue(charge_scheme, concat(@nodeInfo,'/@EndTime'));
set @str_minFee_Cycle=ExtractValue(charge_scheme, concat(@nodeInfo,'/MinFee/@Cycle'));
set @minFee_Cycle=CAST(@str_minFee_Cycle as UNSIGNED);
set @minFee_ChargeFee=ExtractValue(charge_scheme, concat(@nodeInfo,'/MinFee/@ChargeFee'));
set @str_NormalFee_ChargeCycle=ExtractValue(charge_scheme, concat(@nodeInfo,'/NormalFee/@ChargeCycle'));
set @normalFee_ChargeCycle=CAST(@str_NormalFee_ChargeCycle as UNSIGNED);
set @normalFee_ChargeFee=ExtractValue(charge_scheme, concat(@nodeInfo,'/NormalFee/@ChargeFee'));
set @schema_start_time=STR_TO_DATE(concat(@present_date,' ', @node_begin_time),'%Y-%m-%d %H:%i:%s');
set @schema_end_time=STR_TO_DATE(concat(@present_date,' ', @node_end_time),'%Y-%m-%d %H:%i:%s');
if time(@node_end_time) <= time(@node_begin_time) then
set @schema_end_time = DATE_ADD(@schema_end_time, INTERVAL 1 DAY);
end if;
if @schema_start_time >= end_time then
set @is_done=1;
else
if not (@schema_end_time <= begin_time) then
-- insert into memory_scheme select @schema_start_time,@schema_end_time,@minFee_Cycle,@minFee_ChargeFee,@normalFee_ChargeCycle,@normalFee_ChargeFee;
if @is_starting_price = 1 then
-- 正在计算起步价
if @parking_min <= @minFee_Cycle then
RETURN @minFee_ChargeFee;
else
set @stop_dot=IF(end_time >= @schema_end_time, @schema_end_time, end_time);
set @parking_duration=(UNIX_TIMESTAMP(@stop_dot) - UNIX_TIMESTAMP(begin_time)) /60;
--
if @parking_duration >= @minFee_Cycle then
set @result = @minFee_ChargeFee + ceil((@parking_duration-@minFee_Cycle)/@normalFee_ChargeCycle)*@normalFee_ChargeFee;
else
set @result = @minFee_ChargeFee;
set @is_cross_period_starting_price = 1;
set @starting_price_left_min=@minFee_Cycle-@parking_duration;
end if;
set @is_starting_price = 0;
end if;
else
-- 已经算过起步价了
set @stop_dot=IF(end_time >= @schema_end_time, @schema_end_time, end_time);
if @is_cross_period_starting_price = 0 then
set @parking_duration=(UNIX_TIMESTAMP(@stop_dot) - UNIX_TIMESTAMP(@schema_start_time)) /60;
set @result = @result + ceil(@parking_duration/@normalFee_ChargeCycle)*@normalFee_ChargeFee;
else
set @parking_duration=(UNIX_TIMESTAMP(@stop_dot) - UNIX_TIMESTAMP(@schema_start_time)) /60 - @starting_price_left_min ;
set @result = @result + ceil(@parking_duration/@normalFee_ChargeCycle)*@normalFee_ChargeFee;
end if;
end if;
end if;
end if;
end while;
set @present_date=DATE_ADD(@present_date, INTERVAL 1 DAY);
end while;
RETURN @result;
END
Test case
BeginTime
|
2016/1/19 19:17:58
|
EndTime
|
2016/1/19 22:25:13
|
开始时间
|
结束时间
|
计费类型
|
计费单元
|
单元单价
|
金额
|
2016/1/19 19:17
|
2016/1/19 21:17
|
起价
|
1
|
0.08
|
0.08
|
2016/1/19 21:17
|
2016/1/19 22:25
|
夜间
|
3
|
0.02
|
0.06
|
合计
|
0.14
|
函数输出
|
0.14
|
|
|
BeginTime
|
2016/1/17 11:26:05
|
EndTime
|
2016/1/19 15:40:26
|
开始时间
|
结束时间
|
计费类型
|
计费单元
|
单元单价
|
金额
|
2016/1/17 11:26
|
2016/1/17 13:26
|
起价
|
1
|
0.08
|
0.08
|
2016/1/17 13:26
|
2016/1/17 20:00
|
白天
|
14
|
0.04
|
0.56
|
2016/1/17 20:00
|
2016/1/18 8:00
|
夜间
|
24
|
0.02
|
0.48
|
2016/1/18 8:00
|
2016/1/18 20:00
|
白天
|
24
|
0.04
|
0.96
|
2016/1/18 20:00
|
2016/1/19 8:00
|
夜间
|
24
|
0.02
|
0.48
|
2016/1/19 8:00
|
2016/1/19 15:40
|
白天
|
16
|
0.04
|
0.64
|
合计
|
3.20
|
函数输出
|
3.20
|
|
|
分享到:
相关推荐
- **性能优化**:通过优化网络通信和SQL查询解析,提高数据传输效率和处理速度。 - **安全增强**:支持SSL加密连接,确保数据传输的安全性。 - **连接池支持**:可以配合第三方连接池组件如C3P0、DBCP或HikariCP...
MySQL数据库在进行大量数据操作时,实时同步和备份是非常重要的需求。`mysql-binlog-connector-java` 是一个用于读取 MySQL 二进制日志(binlog)的Java库,它可以帮助开发者实现实时的数据复制、数据同步以及增量...
`mysql-connector-java-5.1.32.jar`文件包含了实现这些接口的类和方法,使得Java应用程序能够利用JDBC API与MySQL数据库建立连接、发送SQL语句并处理返回的结果。 在使用`mysql-connector-java-5.1.32`之前,你需要...
在Java编程环境中,解析XML文件是一项常见的任务,特别是在数据处理和集成中。XML(Extensible Markup Language)是一种结构化数据格式,广泛用于存储和传输数据。本教程将介绍如何使用Java解析XML文件,并将解析...
1. 添加依赖:在`pom.xml`文件中引入`mysql-binlog-connector-java`库的依赖。 2. 配置数据库连接:设置SpringBoot的数据库连接配置,包括URL、用户名、密码等。 3. 创建binlog监听器:创建一个类实现`...
通过以上步骤,我们可以成功地将`wthrcdn.etouch.cn`的XML天气数据解析并存储到MySQL数据库中。这个过程涉及了HTTP请求、XML解析、数据清洗、数据库设计、数据转换和数据库操作等多个环节,对提升数据分析和存储能力...
XML文件中的数据以键值对或节点树的形式存在,易于解析和理解。在Java中,处理XML文件通常涉及以下知识点: 1. **DOM解析器**:DOM(Document Object Model)是W3C推荐的标准解析方式,它将整个XML文档加载到内存中...
MySQL数据库自动生成XML文件是一项实用的技术,它可以帮助开发者快速地将数据库中的数据转换为XML格式,便于数据交换、存储或进一步处理。这项技术通常结合代码生成工具,如MyBatis的Generator,能够自动化生成DAO...
首先,我们需要了解串口通信的基本概念,然后学习Java如何处理串口输入,接着是数据解析和数据库操作,最后会涉及到MySQL数据库的设置和数据表的创建。 1. **串口通信基础** 串口通信是一种常见的设备间通信方式,...
总结来说,这个项目涵盖了调用Web服务接口、数据解析、数据库操作等核心IT技能。通过实践,你可以加深对HTTP通信、JSON处理、数据库设计以及数据库操作的理解,提升自己的全栈开发能力。同时,这个项目也提供了学习...
MySQL Connector/J通过实现JDBC接口来与MySQL服务器通信。当你在Java程序中使用`Class.forName()`加载这个驱动,并通过`DriverManager.getConnection()`创建数据库连接时,它会解析并建立到MySQL服务器的TCP/IP连接...
这篇详细的解析将深入介绍MySQL Connector/J的特性、作用以及如何在项目中使用5.1.35这个版本。 首先,MySQL Connector/J遵循JDBC(Java Database Connectivity)标准,使得Java开发者可以使用标准的Java API来访问...
4. **JSTL XML标签**:用于处理XML文档,包括解析、操作和生成XML数据。 **MySQL Connector/J** `mysql-connector-java-5.1.10-bin.jar`是MySQL数据库官方提供的Java驱动程序,使得Java应用程序能够与MySQL数据库...
`javax-servlet` jar包是Java Servlet API的实现,它定义了Servlet和Filter的接口,以及用于Web应用的部署描述符(web.xml)。Servlet是Java中用来处理HTTP请求的服务器端组件,而Filter则允许开发者在请求到达目标...
在实际开发中,为了正确配置MyBatis连接MySQL,你需要在MyBatis的配置文件(通常为`mybatis-config.xml`)中设置数据源和事务管理器。数据源配置包括数据库URL、用户名、密码等信息,而事务管理器则定义了事务的开启...
《SpringBoot集成MybatisPlus、MySQL、POI与RocketMQ深度解析》 SpringBoot作为一款轻量级的Java开发框架,极大地简化了Spring应用的初始搭建以及开发过程。本项目"springboot-mysql-mybatisplus-master.zip"是针对...
`mysql-connector-java-5.1.10-bin.jar`是该驱动的特定版本,它实现了JDBC(Java Database Connectivity)接口,使得Java程序员可以使用SQL语句与MySQL数据库进行交互,执行查询、插入、更新和删除等操作。...
XML是一种自我描述的语言,它的标记可以根据需要自由定义,使得数据结构清晰,易于解析和处理。XML文件是纯文本格式,跨平台性强,支持异构系统之间的数据交换。这使得XML成为了网络应用和数据库间数据交换的理想...
9. **dom4j-1.6.1.jar**:这是一个强大的XML处理库,提供了解析、操作和生成XML文档的能力。开发者可以利用DOM4J来读取、修改XML文件,或者构建XML文档。 10. **commons-httpclient-3.1.jar**:这是Apache Commons ...
在实际开发中,DOM4J常用于数据解析、XML配置文件读取以及XML文档的生成。 JDOM,全称Java Document Object Model,同样是一个用于处理XML的Java库。与DOM4J相比,JDOM更专注于Java对象模型,它将XML文档映射为一个...