从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之间,返回的天必须在当月的合理范围内,这个需要在写代码的时候十分注意,并及时作出总结,并未以后吸取经验和教训。
从Oracle数据库中查询前几个月数据时需要注意的一些问题的更多相关文章
- 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中
oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多,在这介绍两个. 第一种,把oracle查询的数据导出为sql文件,执行sql文件里的insert语句,如下: 第一步,导出sq ...
- 一个简单的批量更新oracle 数据库中 最近的服务商名称的数据
有一个需求是这样的,我们需要更新数据库中的数据,数据时这样的 1.大约50万以上 2. 数据中有较多的重复数据 3. 需要将表中最近的代理商的名称赋值给行中的服务商名称 4. 代理商的名称可能有多个, ...
- oracle数据库只查询前n条
select * from (select * from tablename order by createdate desc) aaa -- 按创建时间倒排序 where rownum &l ...
- 从Oracle数据库中查询与某一时间点最接近的记录
select * from data_taskregionschedule WHERE regioncode='HYL' and updatetime-to_date('2018-05-15','yy ...
- SQL Server 从数据库中查询去年的今天的数据的sql语句
因为最近的项目的一个小功能需要实现当前数据和历史的今天做一个对比.在网上也查了很久,很多都是实现一个月内的,一年内的所有数据,昨晚突然就找到了下面的实现方法,在SQL Server2008中试了一下, ...
- 从mysql数据库中查询最新的一条数据的方法
第一种方法 SELECT * from a where id = (SELECT max(id) FROM a); 第二种方法: select * FROM 表名 ORDER BY id DESC L ...
- Oracle数据库中有关记录个数的查询
一.查询表中全部的记录个数 可用两种方法,一种是在oracle的系统表中统计,另一种需要写存储过程统计,方法分别如下. 1.系统表中统计: SELECT sum(num_rows) FROM user ...
- Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题
一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
随机推荐
- linux 压缩文件或文件夹
zip demo.mp4.zip demo.mp4 zip -r videos.zip videos # 压缩文件夹需要加-r
- POJ2749 Building roads
嘟嘟嘟 最近把21天漏的给不上. 今天重温了一下2-SAT,感觉很简单.就是把所有条件都转化成如果--必然能导出--.然后就这样连边建图,这样一个强连通分量中的所有点必然都是真或者假.从而根据这个点拆 ...
- 转://Oracle Golden Gate 概念和原理
引言:Oracle Golden Gate是Oracle旗下一款支持异构平台之间高级复制技术,是Oracle力推一种HA高可用产品,简称“OGG”,可以实现Active-Active 双业务中心架构 ...
- 100Mbps和100Mb/s有什么不同
100Mbps 和 100Mb/s 有什么不同 Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写 传输速率是指设备的的数据交换能力,也叫“带宽”,单位是Mbps ...
- ubantu下装Docker
Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker. 通过 uname -r 命令查看你当前的内核版本 unam ...
- robotframework日志中文乱码,编译提示‘utf-8’ codecxxxx。
1.需要设置robotframework的语系 2.设置完后,需要重启robotframework才生效.它比较特别,什么改变都要重启才生效
- Spark访问与HBase关联的Hive表
知识点1:创建关联Hbase的Hive表 知识点2:Spark访问Hive 知识点3:Spark访问与Hbase关联的Hive表 知识点1:创建关联Hbase的Hive表 两种方式创建,内部表和外部表 ...
- BZOJ3489 A simple rmq problem K-D Tree
传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...
- Winform开发框架之字段权限控制
在我的很多Winform开发项目中(包括混合框架的项目),统一采用了权限管理模块来进行各种权限的控制,包括常规的功能权限(按钮.菜单权限).数据权限(记录的权限),另外还可以进行字段级别的字段权限控制 ...
- 强大的开源企业级数据监控利器Lepus安装与配置管理
开篇介绍 官方网站:http://www.lepus.cc 开源企业级数据库监控系统 简洁.直观.强大的开源数据库监控系统,MySQL/Oracle/MongoDB/Redis一站式性能监控,让数据库 ...