`

SQL Server:根据起始日期和终止日期以及缴费方式计算每月的缴费记录

阅读更多

做项目时经常碰到的业务:根据合同指定的起租日期和终止日期以及缴费方式,计算出两个日期之间的缴费记录,以便提醒缴费。

 

说明:

1、例子中的两个日期、缴费方式从合同中获取。

2、缴费方式主要有:月份、季付、半年付、年付,且以汉字的形式保存在数据库。

 

思路:根据终止日期和起租日期,计算出两个日期之间相差多少个月份,再根据缴费方式进行月份叠加,即

月付*1,季付*3,半年付*6,年付*12,如此计算出每个月缴费的日期以及下个月缴费的日期,再计算这两个日期之间的天数,最后乘以每天的房租费用,就可以得到每个月应该缴纳的总房租。

SQL如下:

CREATE PROCEDURE [dbo].[calcuteContractPay] 
	@id int --合同序号
AS
BEGIN
	
	SET NOCOUNT ON;

	--1、校验合同序号是否存在
	if @id is null
	begin
		raiserror('必须告知合同序号',16,1);
		return ;
	end   

	--2、获取缴费方式
	declare @field12 varchar(20);--缴费方式
	declare @field39 datetime;--起租日期
	declare @field40 datetime;--截止日期
	declare @field66 numeric(18,2);--每天总租金
	select @field12 = field12,@field39=field39,@field40=field40,@field66=isnull(field66,0) from table3 where field1=@id;
	if @field12 is null or len(@field12)<=0
	begin
		raiserror('必须告知缴费方式',16,1);
		return ;
	end
	
	
	--3、校验日期是否合法
	declare @day int;--两者之间的天数
	set @day = datediff(day,@field39,@field40);
	if(@day<=0)
	begin
		raiserror('终止日期必须大于起租日期',16,1);
		return ;
	end	
	
	--4、根据缴费方式判断总共要输入多少条缴费记录
	set @field12 = rtrim(ltrim(@field12));--去除空格
	declare @monthes int;
	declare @totalRent numeric(18,2);--总租金
	declare @type int;--缴费类型
	if(@field12='月付') set @type=1;
	else if(@field12='季付') set @type=2;
	else if(@field12='半年付') set @type=3;
	else if(@field12='年付') set @type=4;
	
	--4、1 计算开始日期与终止之间有多少个月份		
	set @monthes = datediff(month,@field39,@field40);--月份
	
	if @monthes=0 --说明是在当月/当季/半年之内/当年起租、终止,那么只需要直接计算两者之间的天数
	begin
		set @totalRent = @day*@field66;--天数*每天的总价
		begin
			--添加缴费记录
			insert into table6  
			select field1,field2,field4,field5,field12,field39,@totalRent,field42,field64,field11,0,NULL,0,@totalRent,@totalRent,0,							field13,@day,field40 
			from table3 where field1=@id;
		end
	end
	else --说明至少有一个月
	begin
		declare @startTime datetime;--开始日期
		declare @endTime datetime;--结束日期
		declare @num int;
		set @num=0;
		while(@num<=@monthes)	
		begin
			--print @num;
			set @startTime = dateadd(month,@num,@field39);--计算每个月应缴费日期
			if(@type=1) set @num=@num+1;--月付
			else if(@type=2) set @num=@num+3;--季付
			else if(@type=3) set @num=@num+6;--半年付
			else if(@type=4) set @num=@num+12;--年付

			set @endTime = dateadd(month,@num,@field39);--下个月的缴费日期
			--终止日期减去下一个月的日期,如果终止日期比下一个月的日期大,说明还需要再缴一个月,那么使用下一个月的日期,否则使用终止日期
			set @day = datediff(day,@endTime,@field40);
			if(@day<0) set @endTime=@field40;
			--计算开始日期和结束日期之间的天数
			set @day = datediff(day,@startTime,@endTime);
			set @totalRent = @day*@field66;--天数*每天的总价
			if(@totalRent>0)
			begin
				insert into table6  
				select field1,field2,field4,field5,field12,@startTime,@totalRent,field42,field64,field11,0,NULL,0,@totalRent,@totalRent,0,							field13,@day,@endTime 
				from table3 where field1=@id;
			end
		end		
	end

END
GO

 

 

分享到:
评论

相关推荐

    SQL Server 查询两个日期之间的所有月份

    在SQL Server中,查询两个日期之间的所有月份是一个常见的需求,特别是在数据分析、报表生成或时间序列分析等场景。本文将详细讲解如何使用SQL Server实现这一功能,以满足上述标题和描述中的要求。 首先,我们需要...

    SQL Server各种日期计算方法

    本文将围绕如何在SQL Server环境中有效地处理与日期相关的计算问题展开,具体包括如何使用`DATEADD`、`DATEDIFF`等函数来实现不同日期单位的加减操作以及两日期之间的差值计算。 #### DATEADD 和 DATEDIFF 的基本...

    SQL Server各种日期计算

    在探讨SQL Server中进行日期计算的方法之前,我们必须了解SQL Server中处理日期和时间的基本函数:DATEDIFF和DATEADD。这两个函数在实际应用中非常常用,可以帮助我们得到两个日期间的时间间隔以及通过已知时间间隔...

    SQLServer 根据生日计算年龄

    SQLServer 根据生日计算年龄

    SQL Server中日期问题的解决

    每种方法都有其适用场景和局限性,开发者可以根据实际需求选择最合适的方式来实现日期过滤的功能。此外,随着SQL Server版本的不断更新,还会有更多的新特性被引入,以支持更加灵活和强大的日期处理功能。

    sqlserver 计算当月所有自然周的区间。

    根据提供的文件信息,我们可以了解到这段代码的主要目的是在SQL Server中计算出指定月份的所有自然周的起始和结束日期,并将这些信息存储在一个名为`monthWeekBetween`的表中。接下来,我们将详细解释其中的关键概念...

    sqlserver中日期型字段设默认值

    在SQL Server中,设置日期型字段的默认值可以通过多种方式实现,其中最常用的是使用`GETDATE()`函数和`DATEADD()`函数。下面将详细介绍这两种方法: #### 使用`GETDATE()`函数 `GETDATE()`函数返回系统当前的日期...

    SQL SERVER 关于日期函数(字符转日期,日期转字符串)

    SQL Server 中的日期函数是数据库管理系统中非常重要的一部分,它提供了多种方式来处理日期和时间数据。在本文中,我们将详细介绍 SQL Server 中的日期函数,包括字符转日期、日期转字符串等方面的知识点。 日期...

    SQL SERVER 获取年、季、月、周、日开始时间和结束时间

    --返回开始时间和结束时间 格式:dbo.GetDateStartFirstAndLast(type,datetype,datetime,time) Type 日期类型:(“-”为前一期间,无符号为当期,“+”为后一期间),Y 年,Q 季,M 月,W 周,D 日 例:前一年:-Y...

    sqlserver日期推算(年,季度,月,星期推算) 源码

    sqlserver日期推算(年,季度,月,星期推算) 源码 sql源码

    SQLSERVER计算年龄(岁月天).txt

    SQLSERVER计算年龄(岁月天),可以精确到岁,月,几月几天。

    Inside Microsoft SQL Server 2008 T-SQL Programming.pdf

    - **事务处理**:阐述了事务的基本概念及其在SQL Server中的实现方式,包括如何使用BEGIN TRANSACTION、COMMIT和ROLLBACK语句来确保数据的一致性和完整性。 #### 四、性能优化与最佳实践 为了帮助读者更好地利用...

    kettle链接SQL server驱动 sqljdbc

    5. 在“JDBC URL”字段中,你需要根据你的SQL Server版本和JDBC驱动来构建合适的URL,通常格式如下: `jdbc:sqlserver://&lt;hostname&gt;:;databaseName=;user=;password=&lt;password&gt;` 6. 在“JDBC驱动”部分,选择解压后...

    SQL server Native Client 10.0

    对于开发人员,SQL Server Native Client 10.0提供了丰富的错误处理和诊断工具,包括跟踪和日志记录功能,帮助调试和优化应用程序的数据库访问性能。 总结来说,SQL Server Native Client 10.0是64位环境下的重要...

    sql server客户端连接工具

    SQL Server客户端连接工具是数据库管理员和开发人员用来与Microsoft SQL Server进行交互的重要工具。它提供了图形用户界面(GUI)和命令行选项,使得用户能够轻松地执行查询、管理数据库对象以及进行其他数据库维护...

    sqlServer的jar包

    SQL Server的JAR包是Java开发者在与SQL Server数据库进行交互时所必需的库文件,它们包含了连接、查询、操作数据库所需的各种类和方法。在Java应用程序中,使用这些JAR包可以实现对SQL Server数据库的高效访问。下面...

    SQL Server Native Client 10.0

    安装完成后,可以通过SQL Server Management Studio(SSMS)来配置链接服务器,指定服务器名称、提供程序(这里应选择SQL Server Native Client)、远程服务器的实例以及身份验证方式。 **3. SQL Server Native ...

    Win10可用的Microsoft SQL Server 2008 Native Client

    5. **支持SQL Server的新特性和改进**:包括对XML数据类型的原生支持,改进的错误处理机制,以及对大容量日志记录和快照隔离的支持。 6. **数据类型和函数的扩展**:除了基本的SQL Server数据类型,Native Client还...

Global site tag (gtag.js) - Google Analytics