在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/18sub 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季度同比"等等

转载于:https://www.cnblogs.com/liang3p/p/4819681.html

Perl获取前后任意月份月末相关推荐

  1. js截屏 video_js获取video任意时间的画面截图

    js获取video任意时间的画面截图 更新时间:2019-04-16 09:12:00点击次数:1757次 首先就是要把视频加载出来,然后使用canvas.getContext('2d').drawI ...

  2. Perl获取当前系统时间

    Perl获取当前系统时间 Perl 2010-12-06 10:41:57 阅读236 评论0   字号:大中小 订阅 perl有两个取得时间的函数:localtime和gmtime 两个函数的用法一 ...

  3. Java 时间处理(格式解释、格式化时间、获取当前时间、获取年份、月份等、时间戳转换成时间)

    日期和时间模式(注意大小写,代表的含义是不同的): yyyy:年 MM:月 dd:日 hh:1~12小时制(1-12) HH:24小时制(0-23) mm:分 ss:秒 S:毫秒 E:星期几 D:一年 ...

  4. ORACLE获取当天所在月份的所有日期和周几(每月类似台历显示)

    背景: 做看板的时候,其中有一项内容是,需要根据在看板上显示当月的周别,即类似台历的页面,以大屏的形式显示. 当时然后想了好久,突然间想到好久之前,帮忙写过一个SQL,需要显示当年的所有周别,同时需要 ...

  5. 打印一年内任意月份的日历(C语言)

    题目要求:2007年1月1日为星期一,编写一个函数,输出2007年任意月份的日历 这道题我是个人的做法,有个别地方可能有些绕. #include<stdio.h> int main() { ...

  6. Java获取去年同月份相同星期的日期算法

    前段时间同事做报表,需要与去年同时期的数据做比较,同时期的规则就是: 比如今天是今年2月份的第二个星期三,则要获取去年的2月份的第二个星期三是几月几号. 下面是我给她写的算法,已经过测试可实现相应需求 ...

  7. Python -- 获取今天任意时刻的时间戳

    代码 # -*- coding: utf-8 -*- # Author : markadcfrom datetime import datetime, timedelta# 获取今天任意时刻的时间戳 ...

  8. java调用百度地图api简单示例--获取国内任意两地之间距离

    老师让我们从百度地图的api上获取数据源最为两地运输距离,结果百度地图api的开发文档居然连个示例都没有...于是上网找了半天,都是一百多行的源码,我就想用个api,你给我这玩意???终于最后还是找到 ...

  9. MySQL获取当前年份月份日期

    MySQL获取当前年份月份日期 – 获取年份 YEAR(CURDATE()): 2019 – 获取月份 MONTH(CURDATE()): 6 – 当前时间 DATE(CURDATE()): 2019 ...

  10. perl获取AppAnnie数据

    ...... 需求: 获取https://www.appannie.com/apps/ios/top/united-states/games/?device=iphone 排行榜数据,并得到每个gam ...

最新文章

  1. 监听Settings的值的变化
  2. 脊柱是导致身体生病的重要原因
  3. python超级计算机_Python高性能计算库——Numba
  4. SQL Server之存储过程基础知识
  5. gitee合并分支_使用Gitee进行协作翻译的简单介绍
  6. BZOJ4388 : JOI2012 invitation
  7. POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )
  8. ​迷“铺地砖”的数学家
  9. emacs .emacs_谁在乎Emacs?
  10. 一位做了5年Java开发的读者,跟我说面试题都不会答···
  11. 一个资深系统管理员的O2O实践(三)
  12. Linux0.11 kernel/exit.c中的free_page_tables()
  13. python算法之归并排序
  14. python apply函数_8 个 Python 高效数据分析的技巧
  15. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_15-webpack研究-webpack-dev-server-程序调试...
  16. 关于 epoch、 iteration和batchsize
  17. 求解线性方程的数值方法——Matlab中实现算法
  18. yii2 restful web服务[格式响应]
  19. 教你用R画列线图,形象展示预测模型的结果
  20. ES6的Map数据结构

热门文章

  1. 亚马逊中国官网挂了:因清仓大促销致官网崩溃,谁来背锅?
  2. nosql数据库之Redis持久化、备份和主从配置
  3. centos7安装docker笔记
  4. c#结构体与类的区别
  5. python第三篇:python、flask关系映射
  6. api.execScript
  7. CKfinder中文乱码的解决.
  8. loj 1308(点双连通分量应用)
  9. emacs,objective-c mode 代码补全!
  10. 微信小程序 页面递归生成