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
|
|
|
分享到:
相关推荐
思路:Storm集群从Kafkatopic主题获取数据,解析后写入MySQL,注意我们使用MyBatis工具与数据库交互 项目结构 部署MySQL 我们在服务器上部署一台MySQL数据库 具体参考这篇文章 数据库表结构如下: ...
1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...
1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...
dom4j 优秀的JavaXML API 主要用于解析XML文档 poi组件 主要用于读取以及写入Microsoft Office格式档案 JSR 303 为实体验证定义了一个元数据模型和API 前端技术选型 JS框架:jQuery 1.8 CSS框架:Twitter Bootstrap ...
1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...
1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...
15.2.2 数据丢失和数据破坏 15.2.3 数据修改 15.2.4 拒绝服务 15.2.5 软件错误 15.2.6 否认 15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥...
易语言5.1 相对于易语言5.0更新说明: ... 修改XML解析支持库,增加写出CDATA数据功能,解决解析XML时错误的丢弃换行和TAB字符的BUG,解决读取节点值时对CDATA数据进行转义处理的BUG。 20. 修改扩展界面支持库...
15.2.2 数据丢失和数据破坏 15.2.3 数据修改 15.2.4 拒绝服务 15.2.5 软件错误 15.2.6 否认 15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 ...
您可以设置 cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用 PDF 文档解析 XML 的任何事情。 phpMyAdmin 是一个用PHP编写的软件工具,可以通过 web ...
11. 接口测试:POST or GET 方式检测系统接口,参数加密,json返回结果,计算服务器响应时间 12. 发送邮件:单发,群发邮件 13. 置二维码:生成二维码图表保存到服务器 or 解析读取二维码内信息 14. 图表报表:...
如生成接口映射器,生成xml配置文件。可通过实体类在生成自动建表,自动加索引,自动更新数据列。可检测出数据库与实体类之间的差异并在日志中打印出对应警告或修复用的sql语句。如警告:数据库中的列[mysql_name-> ...
Hibernate使用dom4j解析XML配置文件和XML映射元文件。必需的。 ehcache-1.2.jar Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 ...
- **数据解析**:采用Jsoup、XPath等库解析HTML/XML文档,提取有用信息。 - **持久化存储**:支持将抓取的数据存储到MySQL、MongoDB等数据库,或者保存为本地文件,如CSV、JSON格式。 - **可配置性**:允许用户通过...
15.2.2 数据丢失和数据破坏 15.2.3 数据修改 15.2.4 拒绝服务 15.2.5 软件错误 15.2.6 否认 15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥...
如生成接口mapper,生成xml配置文件。 可通过实体类在生成自动建表,自动加索引,自动更新数据列。 可检测出数据库与实体类之间的差异并在日志中打印出对应警告或者修复用的sql语句。 如 warn : 数据库中的列 [mysql_...
您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用PDF文档解析XML的任何事情.[1] phpMyAdmin 是一个用PHP编写的软件工具,可以通过web方式控制和...
如生成接口mapper,生成xml配置文件。 可通过实体类在生成自动建表,自动加索引,自动更新数据列。 可检测出数据库与实体类之间的差异并在日志中打印出对饮警告或者修复用的sql语句。 如 warn : 数据库中的列 [mysql_...
创建springMVC.xml配置,配置注解扫描,注解驱动,视图解析器 4.编写controller 第四步:spring和springmvc整合 整合的要点:就是让springmvc从servletContext中获取spring容器即可 1.在web.xml中配置spring的...
并让这个handler继承IRequiresSessionState接口,一定要继承这个接口,否则会出错的。 以上本人简单总结 只有用使用到它才能感觉到很奇妙 主要jquery ajax静态页面查询添加 数据无刷新效果 数据库采用的sql2008 ...