`

MySQL的XML接口-数据解析

阅读更多

      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

 

 
0
0
分享到:
评论

相关推荐

    基于 mysql-binlog-connector-java 实现增量数据的收集.zip

    MySQL数据库在进行大量数据操作时,实时同步和备份是非常重要的需求。`mysql-binlog-connector-java` 是一个用于读取 MySQL 二进制日志(binlog)的Java库,它可以帮助开发者实现实时的数据复制、数据同步以及增量...

    mysql-connector-java-5.1.27.jar

    - **性能优化**:通过优化网络通信和SQL查询解析,提高数据传输效率和处理速度。 - **安全增强**:支持SSL加密连接,确保数据传输的安全性。 - **连接池支持**:可以配合第三方连接池组件如C3P0、DBCP或HikariCP...

    mysql-connector-java-5.1.32

    `mysql-connector-java-5.1.32.jar`文件包含了实现这些接口的类和方法,使得Java应用程序能够利用JDBC API与MySQL数据库建立连接、发送SQL语句并处理返回的结果。 在使用`mysql-connector-java-5.1.32`之前,你需要...

    使用java解析XML文件,解析完之后将解析结果导入mysql数据库中

    在Java编程环境中,解析XML文件是一项常见的任务,特别是在数据处理和集成中。XML(Extensible Markup Language)是一种结构化数据格式,广泛用于存储和传输数据。本教程将介绍如何使用Java解析XML文件,并将解析...

    springboot-binlog:基于 mysql-binlog-connector-java 实现增量数据的收集

    1. 添加依赖:在`pom.xml`文件中引入`mysql-binlog-connector-java`库的依赖。 2. 配置数据库连接:设置SpringBoot的数据库连接配置,包括URL、用户名、密码等。 3. 创建binlog监听器:创建一个类实现`...

    解析wthrcdn.etouch的xml格式天气存入mysql数据库

    通过以上步骤,我们可以成功地将`wthrcdn.etouch.cn`的XML天气数据解析并存储到MySQL数据库中。这个过程涉及了HTTP请求、XML解析、数据清洗、数据库设计、数据转换和数据库操作等多个环节,对提升数据分析和存储能力...

    报文日志文件入库实例---XML解析

    XML文件中的数据以键值对或节点树的形式存在,易于解析和理解。在Java中,处理XML文件通常涉及以下知识点: 1. **DOM解析器**:DOM(Document Object Model)是W3C推荐的标准解析方式,它将整个XML文档加载到内存中...

    mysql数据库自动生成xml文件

    MySQL数据库自动生成XML文件是一项实用的技术,它可以帮助开发者快速地将数据库中的数据转换为XML格式,便于数据交换、存储或进一步处理。这项技术通常结合代码生成工具,如MyBatis的Generator,能够自动化生成DAO...

    JAVA串口助手接收数据并解析数据存入MySQL数据库中

    首先,我们需要了解串口通信的基本概念,然后学习Java如何处理串口输入,接着是数据解析和数据库操作,最后会涉及到MySQL数据库的设置和数据表的创建。 1. **串口通信基础** 串口通信是一种常见的设备间通信方式,...

    调用天气接口存入数据库---mysql

    总结来说,这个项目涵盖了调用Web服务接口、数据解析、数据库操作等核心IT技能。通过实践,你可以加深对HTTP通信、JSON处理、数据库设计以及数据库操作的理解,提升自己的全栈开发能力。同时,这个项目也提供了学习...

    mysql-connector-java-5.0.8-bin.zip

    MySQL Connector/J通过实现JDBC接口来与MySQL服务器通信。当你在Java程序中使用`Class.forName()`加载这个驱动,并通过`DriverManager.getConnection()`创建数据库连接时,它会解析并建立到MySQL服务器的TCP/IP连接...

    mysql-connecter-java-5.1.35

    这篇详细的解析将深入介绍MySQL Connector/J的特性、作用以及如何在项目中使用5.1.35这个版本。 首先,MySQL Connector/J遵循JDBC(Java Database Connectivity)标准,使得Java开发者可以使用标准的Java API来访问...

    jstl-api-1.2.jar、jstl-impl-1.2.jar、mysql-connector-java-5.1.10-bin.jar

    4. **JSTL XML标签**:用于处理XML文档,包括解析、操作和生成XML数据。 **MySQL Connector/J** `mysql-connector-java-5.1.10-bin.jar`是MySQL数据库官方提供的Java驱动程序,使得Java应用程序能够与MySQL数据库...

    mysql-connection jar包

    `javax-servlet` jar包是Java Servlet API的实现,它定义了Servlet和Filter的接口,以及用于Web应用的部署描述符(web.xml)。Servlet是Java中用来处理HTTP请求的服务器端组件,而Filter则允许开发者在请求到达目标...

    mybatis 连接mysql数据库时所需所有jar包

    在实际开发中,为了正确配置MyBatis连接MySQL,你需要在MyBatis的配置文件(通常为`mybatis-config.xml`)中设置数据源和事务管理器。数据源配置包括数据库URL、用户名、密码等信息,而事务管理器则定义了事务的开启...

    springboot-mysql-mybatisplus-master.zip

    《SpringBoot集成MybatisPlus、MySQL、POI与RocketMQ深度解析》 SpringBoot作为一款轻量级的Java开发框架,极大地简化了Spring应用的初始搭建以及开发过程。本项目"springboot-mysql-mybatisplus-master.zip"是针对...

    jstl-api-1.2.jar jstl-impl-1.2.jar mysql-connector-java-5.1.10-bin.jar

    `mysql-connector-java-5.1.10-bin.jar`是该驱动的特定版本,它实现了JDBC(Java Database Connectivity)接口,使得Java程序员可以使用SQL语句与MySQL数据库进行交互,执行查询、插入、更新和删除等操作。...

    将关系型数据库MySQL存储数据转换为XML文件的实现

    XML是一种自我描述的语言,它的标记可以根据需要自由定义,使得数据结构清晰,易于解析和处理。XML文件是纯文本格式,跨平台性强,支持异构系统之间的数据交换。这使得XML成为了网络应用和数据库间数据交换的理想...

    httpclient-4.4.jar mysql-connector-java-5.0.8-bin.jar等等

    9. **dom4j-1.6.1.jar**:这是一个强大的XML处理库,提供了解析、操作和生成XML文档的能力。开发者可以利用DOM4J来读取、修改XML文件,或者构建XML文档。 10. **commons-httpclient-3.1.jar**:这是Apache Commons ...

    dom4j、jdom、mysql-connector相关jar包

    在实际开发中,DOM4J常用于数据解析、XML配置文件读取以及XML文档的生成。 JDOM,全称Java Document Object Model,同样是一个用于处理XML的Java库。与DOM4J相比,JDOM更专注于Java对象模型,它将XML文档映射为一个...

Global site tag (gtag.js) - Google Analytics