PERL获取前后任意月份月末

在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

PERL获取前后任意月份月末的相关文章

PHP 获取数组任意下标key的上一个prev和下一个next下标值

PHP 获取数组任意下标key的上一个prev和下一个next下标值 <?php $xoops[1] = '小'; $xoops[2] = '孩'; $xoops[3] = '子'; $xoops[4] = '气'; $steps = new Steps(); foreach($xoops as $key=>$value){ $steps->add($key); } $steps->setCurrent(3);//参数为key值 echo '上一个下标:'.$steps->g

获取下个月的月份

//获取下个月的月份 public function getNextMonthDays($date){ $timestamp=strtotime($date); $arr=getdate($timestamp); if($arr['mon'] == 12){ $year=$arr['year'] +1; $month=$arr['mon'] -11; $firstday=$year.'-0'.$month.'-01'; $lastday=date('Y-m',strtotime("$firstd

[码海拾贝 之Perl]获取日期以及日期的加减

前言 在Perl 中, 不安装其他模组的状况下, 可以使用 localtime 来获取当地日期和时间. 在标量上下文中, 返回的是字符串格式. my $localtime = localtime(); print "\n$localtime\n"; 返回: Thu Jan  1 18:17:56 2015 在列表上下文中, 返回的是描述当前时间的一个元素列表 my ($sec,$min,$hour,$mday,$mon,$year_off,$wday,$yday,$isdat) = l

【转】获取OSGi任意Bundle的ClassLoader

在OSGi环境中,在Bundle内部代码中要得到自己Bundle的ClassLoader就很简单,在自己Bundle的代码中,直接写this.getClass().getClassLoader()就得到了自己Bundle的ClassLoader了.但怎么在其他Bundle或外部代码中得到任意一个Bundle的ClassLoader呢?Bundle和BundleContext都没有提供getClassLoader方法来获取,我就用了一种比较另类的方法来获取.突破口就在Bundle.loadClas

unity3d 依赖关系获取预制件任意资源

前段时间策划们想知道UI预制件中使用了哪些音效 N多预制件.N多音效!! 如果纯人工整理的话这还不累成狗? 累成狗不说,还容易出错 所以获取音频剪辑小工具就诞生了,将策划从死亡边缘拉了回来 我们先看一下相关API手册:http://game.ceeger.com/Script/EditorUtility/EditorUtility.CollectDependencies.html 这玩意可好用了,之前也用它做过获取预制件公共资源工具 看看名字:“收集依赖关系” 那还不简单明了了,有依赖关系的东西

获取两个月份之间的相差的月份

/** * 获取两个日期之间所有的月份 * @param string $date1 - 起始日期 默认1970-01-01 * @param string $date2 - 截止日期 默认1970-02-01 * @return array */ public function getMonthNum(string $date1 = '1970-01-01', string $date2 = '1970-02-01'):array { $time1 = strtotime($date1); /

javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

jsp页面表格布局Html代码 <body > <center> <input type="text" value="111" id="mytext"> <table border="1" width="60%" id="mytable"> <tr> <td id="td1">第一行第一列<

Perl获取目录下文件或者包含子目录下文件

1 my $dir = "D:\\My_Work\\Temp"; 2 my @files = (); 3 4 #获取给定目录下文件 5 @files = get_dir_files($dir); 6 7 #获取给定目录以及子目录下文件 8 @files = get_dir_files_x($dir); 9 10 #获取目录下以及子目录下文件,返回的结果中包含路径 11 sub get_dir_files_x{ 12 my ($dir_p) = @_; 13 my @files = ()

获取网页任意标签的ID,内容

function deleteAction(obj) {            // debugger;            //获取需要的ID列            var $statusParent = $(obj).parent().parent().find("td");            //状态            var status = 0;            //循环ID列            for (var i = 0; i < $statu