在BI报表开发时,经常需要计算同比环比,需要用到月末日期,用数据库系统的日期函数操作需要在每处用到日期的地方都把函数写一遍,在某些特殊情形,函数会很复杂,甚至不能实现想要的结果。
比如在Teradata中的Addmonths函数,只计算了月份:
日期 | 增量值 | 结果 |
2015/01/01 | 1 | 2015/02/01 |
2015/01/31 | 1 | 2015/02/28 |
2015/02/28 | -1 | 2015/01/28 |
2015/03/31 | -1 | 2015/02/28 |
2015/02/28 | 0 | 2015/02/28 |
如表格所示,遇到月末的时候,不能统计整月的信息,常常不是想要的结果。
因此有必要在作业中加入变量,实现每月取月末的数据。
perl实现如下,简单测试,生产环境上线前请使用sprintf格式化一下。
#!/usr/bin/perl # 获取任意月份月末日期 # Liangwl # 2015/9/18 sub Add_Delta_Month { my ($date,$cnt) = @_; my $year = int($date/10000); my $month = int($date/100)%100 + $cnt -1; my $yyyymm = ($year + floor($month/12)) * 100 + $month % 12 + 1; my @mmdd; push @mmdd,qw(0131),(int($yyyymm/100)%4==0?"0229":"0228"),qw(0331 0430 0531 0630 0731 0831 0930 1031 1130 1231); return int($yyyymm/100).$mmdd[($yyyymm%100-1)%12]; } sub floor { my ($i) = @_; return $i >= int($i) ? int($i) : int($i) - 1; } print Add_Delta_Month(20150131,-14)."\n"; print Add_Delta_Month(20150131,-13)."\n"; print Add_Delta_Month(20150131,-12)."\n"; print Add_Delta_Month(20150131,0)."\n"; print Add_Delta_Month(20150131,1)."\n"; print Add_Delta_Month(20150131,11)."\n"; print Add_Delta_Month(20150131,12)."\n"; print Add_Delta_Month(20150131,13)."\n\n";
应用场景:"最近六个月统计数据","环比变化","同比变化","X季度同比"等等
时间: 2024-10-09 10:47:08