1.SQLServer的创建脚本如下:
USE [master]
GO
/****** Object: Database [test] Script Date: 10/29/2009 17:43:10 ******/
CREATE DATABASE [test] ON PRIMARY
( NAME = N'test', FILENAME = N'D:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/test.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'test_log', FILENAME = N'D:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/test_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [test] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [test].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [test] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [test] SET ANSI_NULLS OFF
GO
ALTER DATABASE [test] SET ANSI_PADDING OFF
GO
ALTER DATABASE [test] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [test] SET ARITHABORT OFF
GO
ALTER DATABASE [test] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [test] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [test] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [test] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [test] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [test] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [test] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [test] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [test] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [test] SET DISABLE_BROKER
GO
ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [test] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [test] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [test] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [test] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [test] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [test] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [test] SET READ_WRITE
GO
ALTER DATABASE [test] SET RECOVERY FULL
GO
ALTER DATABASE [test] SET MULTI_USER
GO
ALTER DATABASE [test] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [test] SET DB_CHAINING OFF
GO
2.SQL脚本如下:
--变量定义开始
--以下是外部变量的定义
--以下是内部变量的定义
--整体的记录数
declare @Recordcount int
--子记录数
declare @RecordIDCount int
declare @开始时间 date
declare @结束时间 date
declare @利息开始时间 date
declare @利息结束时间 date
declare @ID int
declare @maxID int
--变量定义结束
--判断临时表是否存在如果存在则删除
if OBJECT_ID('tempdb.dbo.#t1') is not null
begin
drop table #t1
end
--如果不存在,则从新创建临时表
create Table #t1 (identityID int identity(1,1),id int,姓名 nvarchar(50),开始时间 date ,结束时间 date ,本金 float,实际利息 float,利息开始时间 date,利息结束时间 date, 利率 float,计息月份 int)
insert into #t1
select t1.*, t2.开始时间,t2.结束时间,t2.利率,t2.计息月份 from Table1 t1 left join Table2 t2 on t1.开始时间 between t2.开始时间 and t2.结束时间 or t1.结束时间 between t2.开始时间 and t2.结束时间
--通过计算更新临时表中相应的计息月份
--判断记录数是否为空
set @Recordcount = (select COUNT(identityID) from #t1)
if @Recordcount > 0
begin
set @ID = (select MIN(identityID) from #t1)
set @maxID = (select max(identityID) from #t1)
while @ID<=@maxID
begin
--判断记录是否存在
set @RecordIDCount = (select COUNT(identityID) from #t1 where identityID=@ID)
if @RecordIDCount >0
begin
set @开始时间 = (select 开始时间 from #t1 where identityID = @ID)
set @结束时间 = (select 结束时间 from #t1 where identityID = @ID)
set @利息开始时间 = (select 利息开始时间 from #t1 where identityID = @ID)
set @利息结束时间 = (select 利息结束时间 from #t1 where identityID = @ID)
if @开始时间 < @利息开始时间
begin
if @结束时间 < @利息结束时间
begin
--时间段是从:@利息开始时间 -- @结束时间
update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@结束时间)*12+DATEPART(MONTH,@结束时间))-DATEPART(YEAR,@利息开始时间)*12+DATEPART(MONTH,@利息开始时间))) where identityID=@ID
end
else if @结束时间 > @利息结束时间
begin
--时间段是从:@利息开始时间 -- @利息结束时间
update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@利息结束时间)*12+DATEPART(MONTH,@利息结束时间))-DATEPART(YEAR,@利息开始时间)*12+DATEPART(MONTH,@利息开始时间))) where identityID=@ID
end
end
else if @开始时间 > @利息开始时间
begin
if @结束时间 < @利息结束时间
begin
--时间段是从:@开始时间 -- @结束时间
update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@结束时间)*12+DATEPART(MONTH,@结束时间))-DATEPART(YEAR,@开始时间)*12+DATEPART(MONTH,@开始时间))) where identityID=@ID
end
else if @结束时间 > @利息结束时间
begin
--时间段是从:@开始时间 -- @利息结束时间
update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@利息结束时间)*12+DATEPART(MONTH,@利息结束时间))-DATEPART(YEAR,@开始时间)*12+DATEPART(MONTH,@开始时间))) where identityID=@ID
end
end
end
set @ID = @ID+1
end
end
select SUM(本金*利率*计息月份) from #t1 where 姓名='张三'