从Oracle数据库中查询前几个月数据时需要注意的一些问题

在最近的一个项目中,有一个需求就是要查询数据库中前几个月的历史数据,但是由于自己考虑不全面造成了程序的bug,现在将这一块好好作一个总结,希望以后不再犯这种很低级的错误,首先贴出查询中用到的一个子函数,然后就此作出详细的分析:

 private string AddMonths(string originalTime, int months)
        {
            string returnString = string.Empty;
            string[] dataAndTime = originalTime.Split(new char[] { ‘ ‘ });
            if (dataAndTime.Length > 0)
            {
                string date = "";
                if (!string.IsNullOrWhiteSpace(dataAndTime[0]))
                {
                    date = dataAndTime[0];
                    string[] yearMonthDay = date.Split(new char[] { ‘/‘ });
                    int year = int.Parse(yearMonthDay[0]);
                    int month = int.Parse(yearMonthDay[1]);
                    int day = int.Parse(yearMonthDay[2]);
                    if (months != 0)
                    {
                        if (month > months)
                        {
                            month = month - months;
                            //判断该月总共有多少天
                            int days = DateTime.DaysInMonth(year, month);
                            if (day > days)
                                day = days;
                            returnString = year.ToString() + "/" + month.ToString() + "/" + day.ToString() + " " + dataAndTime[1];
                        }
                        if (month ==months)
                        {
                            month = 12;
                            year = year - 1;
                            int days = DateTime.DaysInMonth(year, month);
                            if (day > days)
                                day = days;
                            returnString = year.ToString() + "/" + month.ToString() + "/" + day.ToString() + " " + dataAndTime[1];

                        }
                        if (month < months)
                        {
                            month = month + 12 - months;
                            year = year - 1;
                            int days = DateTime.DaysInMonth(year, month);
                            if (day > days)
                                day = days;
                            returnString = year.ToString() + "/" + month.ToString() + "/" + day.ToString() + " " + dataAndTime[1];
                        }
                    }
                    else
                    {
                        returnString = originalTime;
                    }
                }
            }
            return returnString;
        }

  这个函数中有两个参数,第一个originalTime代表的是从数据库中查询到的最近的日期,第二个参数就是months,表示从最近日期往前推多少个月,在我们的程序中首先通过分割字符串的方式来获取当前的年月日,就我们当前的月份month和查询周期months作比较,第一种情况就是当前月份大于查询周期,这种情况获取的最后月份就是month和months作差,在这里年不需要变化,但是必须注意到的一点是day的取值,举个例子从数据库中查询到的当前刚好是12月31号,此时如果查询周期为6个月,直接返回差值6月31号的话程序必然会出错,因为6月份没有31号,这点必须引起重视,所以我们在程序中才有了如下的判断,  

int days = DateTime.DaysInMonth(year, month)

if (day > days)

day = days;

   这里面有个函数DateTime.DaysInMonth(year, month)这个函数是用来判断某一年某一月总共有多少天,如果当前日期天数超过了查询后的日期当月的天数那么只能取当月的最大天数了,就像12月31号往前推6个月一定是6月30号而不是6月31号,这些简单的逻辑问题一定不能出错,这个是需要特别注意的。根据month和months的关系必须分三种情况来讨论,即:month>months和month=months以及month<months三种情况进行讨论一种都不能少,总之返回的日期必须合理年,月份必须在1到12之间,返回的天必须在当月的合理范围内,这个需要在写代码的时候十分注意,并及时作出总结,并未以后吸取经验和教训。

时间: 2025-01-07 11:43:53

从Oracle数据库中查询前几个月数据时需要注意的一些问题的相关文章

SQL Server 从数据库中查询去年的今天的数据的sql语句

因为最近的项目的一个小功能需要实现当前数据和历史的今天做一个对比.在网上也查了很久,很多都是实现一个月内的,一年内的所有数据,昨晚突然就找到了下面的实现方法,在SQL Server2008中试了一下,正是我想要的结果.故写了一个随笔,如果以后还需要可以方便查找,另外也希望可以帮到需要的人. Select * From History where savetime=(select dateAdd(yy,-1,getdate())) 其中,History是数据库的名字,savetime是表示时间的字

查询Oracle 数据库中带有lob字段的某一个表的大小

注意:由于lob字段有独立的lob segment来存储,故对于带有lob字段的表,不能仅仅查询dba_segments. 以下脚本来自: How to Compute the Size of a Table containing Outline CLOBs and BLOBs[Article ID 118531.1] 经过修改:改为了NVL(SUM(S.BYTES),0) SQL> col "TOTAL TABLE SIZE" format 99999999999999 ---

一起ORACLE数据库中数据查询结果不一致问题的排查过程

一.问题描述 在某软件开发项目中,需要在ORACLE数据库中建立十张类型相同的员工信息表tb_employeeinfo0~tb_employeeinfo9,并建立向这十张表中插入数据的存储过程.ORACLE数据库安装在Linux操作系统下. 为了操作上的方便性,开发人员在PL/SQL Developer软件(ORACLE数据库开发软件)上实现了建表和建存储过程的操作.之后,开发人员利用SQL语句在在PL/SQL Developer软件上实现了向某个数据表中插入数据的操作.利用select语句查询

Oracle数据库中序列(SEQUENCE)的用法详解

在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了序列的用法,希望能够对您有所帮助. AD: 在Oracle数据库中,什么是序列呢?它的用途是什么?序列(SEQUENCE)其实是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值. 创建序列需要CREATE SEQUENCE系统权限

Oracle数据库中调用Java类开发存储过程、函数的方法

Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL,除此之外,还可以用时下最流行的编程语言Java来做开发.随着对oracle的了解越来越多,越来越禁不住oracle的诱惑,oracle技术真的是一门很有趣的学问.之前,我在博客中总结了挺多有关SQL.PL/SQL的,但是对于oracle数据库中Java类的调用却没有总结,也是因为之前不太会,这会儿总

随机获取oracle数据库中的任意一行数据(rownum)

最近看oracle资料的时候,了解rownum的概念,以前只知道对数据库表进行简单的增删改查: 看到了rownum的概念后,突然想到了好多业务场景应该都可以适用的,比如在进行随机发奖的时候, 我们就可以从先查一下奖品表中可以发的总奖品数,然后通过java的Random类在总奖品数内生成一个随机整数X,然后调用 select * from (select rownum no,id from Table where rownum<=X ) where no >=X 获取出该条奖品,这样获取出来的值

Oracle数据库实现获取前几条数据的方法

如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的SELECT TOP N的方法.本文将告诉您答案,举例说明了哟!   1.在Oracle中实现SELECT TOP N :    由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询.  简单地说,实现方法如下所示:  SELECT 列名1...列名n FROM (SELECT 列名1...列名n FROM 表名ORDER B

如何处理Oracle数据库中的坏块问题

本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了. 一:什么是数据库的坏块   首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer.在我们对数据块进

Oracle数据库中的blob类型解析

Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? 这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作