锋利的SQL:时间段天数统计
2012-12-25 01:30
288 查看
这是在做利息计算时经常遇到的问题。例如,在表1所示的表中记录着贷款的发放和分期归还信息,现在要计算该笔贷款的利息,则应当分期计算。从2009年11月1日至2009年12月1日的贷款额是20000.00元,资金使用时间是30天,这段期间的利息=20000.00×30×日利率。归还10000.00元后,从2009年12月1日至2010年1月1日的贷款额变为10000.00元,资金使用时间是31天,这段期间的利息=10000.00×31×日利率。现在关键的问题是如何计算出两个日期之间的天数。
表1
贷款明细表
首先来创建上面的示例表,代码如下:
CREATE TABLE Loans
(loan_id int,
loan_datedate,
summarychar(10),
dr_amtdecimal(12,2),
cr_amtdecimal(12,2),
baldecimal(12,2));
INSERT INTO Loans
VALUES (1, '2009-11-01', '发放贷款', 20000.00, NULL, 20000.00),
(1,'2009-12-01', '归还贷款', NULL,10000.00, 10000.00),
(1,'2010-01-01', '归还贷款', NULL,5000.00, 5000.00),
(1,'2010-02-01', '结清', NULL,5000.00, 0.00);
下面的语句将Loans表打开2次,然后取出大于当前日期的第一个日期,保存在next_date列中。查询结果如表2所示。
SELECT loan_id, loan_date,
(SELECT MIN(loan_date)
FROMLoans AS L2
WHERE L2.loan_id = L1.loan_id
AND L2.loan_date > L1.loan_date) AS next_date,
bal
FROM Loans AS L1
表2
查询结果
由上表可以看出,next_date-loan_date就可以计算出两次日期之间的天数。下面是完整的语句:
SELECT loan_id, loan_date,
DATEDIFF(DAY, loan_date,
(SELECT MIN(loan_date)
FROM Loans AS L2
WHERE L2.loan_id = L1.loan_id
AND L2.loan_date >L1.loan_date)) AS diff_days,
bal
FROM Loans AS L1;
表1
贷款明细表
loan_id | loan_date | summary | dr_amt | cr_amt | bal |
1 | 2009-11-01 | 发放贷款 | 20000.00 | NULL | 20000.00 |
1 | 2009-12-01 | 归还贷款 | NULL | 10000.00 | 10000.00 |
1 | 2010-01-01 | 归还贷款 | NULL | 5000.00 | 5000.00 |
1 | 2010-02-01 | 结清 | NULL | 5000.00 | 0.00 |
CREATE TABLE Loans
(loan_id int,
loan_datedate,
summarychar(10),
dr_amtdecimal(12,2),
cr_amtdecimal(12,2),
baldecimal(12,2));
INSERT INTO Loans
VALUES (1, '2009-11-01', '发放贷款', 20000.00, NULL, 20000.00),
(1,'2009-12-01', '归还贷款', NULL,10000.00, 10000.00),
(1,'2010-01-01', '归还贷款', NULL,5000.00, 5000.00),
(1,'2010-02-01', '结清', NULL,5000.00, 0.00);
下面的语句将Loans表打开2次,然后取出大于当前日期的第一个日期,保存在next_date列中。查询结果如表2所示。
SELECT loan_id, loan_date,
(SELECT MIN(loan_date)
FROMLoans AS L2
WHERE L2.loan_id = L1.loan_id
AND L2.loan_date > L1.loan_date) AS next_date,
bal
FROM Loans AS L1
表2
查询结果
loan_id | loan_date | next_date | bal |
1 | 2009-11-01 | 2009-12-01 | 20000.00 |
1 | 2009-12-01 | 2010-01-01 | 10000.00 |
1 | 2010-01-01 | 2010-02-01 | 5000.00 |
1 | 2010-02-01 | NULL | 0.00 |
SELECT loan_id, loan_date,
DATEDIFF(DAY, loan_date,
(SELECT MIN(loan_date)
FROM Loans AS L2
WHERE L2.loan_id = L1.loan_id
AND L2.loan_date >L1.loan_date)) AS diff_days,
bal
FROM Loans AS L1;
相关文章推荐
- 锋利的SQL:同一时间范围内并发数统计
- 锋利的SQL:数字范围统计
- SQL按日期天数(即 每日)合并统计项
- sql语句,多表关联查询,主要是T1表的日期在T2、T3时间段的统计查询
- 缺勤天数统计的处理示例.sql
- 统计在某月某时间段工作的天数,除去周末
- (SQL语句)按指定时间段分组统计
- 统计时间段内周分类SQL语句
- Java统计两个日期时间段每个月对应的天数
- SQL——按照季度,固定时间段,分组统计数据
- 两个时间段相差的天数 sql
- 用sql语句按指定时间段分组统计
- 锋利的SQL:地域范围内最大数统计
- SQL 实现某时间段的统计业务
- SQL统计查询时间段内工作日之和
- 统计指定时间段内的周未(非周未)天数
- SQL 实现某时间段的统计业务
- SQL游标操作每隔5分钟时间段数据统计信息
- SQL按时间段统计(5分钟统计一次访问量为例,oracle统计)
- 在Oracle的SQL中,如何计算两个日期时间段的交集天数