银行--根据日期算出固定时间积分

题目:如下表

该表以拉链的方式存储账户的余额信息,请以2012-8-7日为数据日期,计算从2012-8-1日到2012-8-7各账号的积数,【应该说明哪个日期是开区间,那个日期是闭区间】


建表语句:
eg: 字段名如下

create table t03_acct_bal_h(
Acct_no bigint comment '账号id',
Current_bal bigint COMMENT '当前余额',
Org_name string COMMENT '所属机构',
Start_dt string COMMENT '开始日期',
End_dt string COMMENT '结束日期'
)
row format delimited fields terminated by '\t';




插入数据如下:
9000000001	100	杭州分行	20120101	20120304
9000000001	200	杭州分行	20120304	20120606
9000000001	300	杭州分行	20120606	20120608
9000000001	400	杭州分行	20120608	30001231
9000000002	500	宁波分行	20120101	20120112
9000000002	900	宁波分行	20120112	30001231
9000000003	100	上海分行	20120101	30001231




题目说明:30001231:该日期最大日期,表示账号余额至今一直未变动,且为最新余额。
         积分概念:积数指的是在银行的账户内存款余额*存款天数。例如a客户的账号在8月1日余额为100,8月4日余额为200,截止8月6日余额为100。至8月7日的积数为:100*3+200*2+100*2





思路:要先把8.1号之前的积分清算出来,8.1号到8.7号的数值是不变的。用8.1号的积分,乘以8.7号到8.1号总共天数即可。


代码实现:
with chazhi02 as(
select *,
datediff(
case when
from_unixtime(unix_timestamp(End_dt,'yyyyMMdd')
,'yyyy-MM-dd')='3000-12-31'
 then '2012-08-01'
else
 from_unixtime(unix_timestamp(End_dt,'yyyyMMdd')
,'yyyy-MM-dd')
end,
from_unixtime(
unix_timestamp(Start_dt,'yyyyMMdd')
,'yyyy-MM-dd')
) as cha from t03_acct_bal_h
)
select Acct_no,sum((current_bal*cha)*
datediff('2012-08-07','2012-08-01')
) as riqi from chazhi02 group by Acct_no;


总结:重点是时间的转换,  

      1、from_unixtime 是转换时间类型,进行格式化
      2、unix_timestamp  是对时间进行时间戳的转换
      3、datediff 是两个时间相减






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值