Java向Oracle存date(探索)

本文通过实战案例介绍如何在Oracle数据库中存储日期类型,并对比使用Java的Date对象与字符串方式的不同,分享解决过程中遇到的问题及优化方案。

背景

前些天要做一个公开课管理模块,里边刚好有张表里边的字段有日期类型,纠结着是存成date还是varchar2,后来又想到可能还会有两个日期之间的天数,所以存成了date类型。本想着往Oracle中存个date很简单吧,没成想全是坑啊,现在分享下我踩的坑!!!

在数据库中研究下Date类型

INSERT INTO publiclesson VALUES('01',date'2019-07-04','暑期安全讲座','吴永勤','学生会','扇形报告厅','全体暑期留校人员都要参加','点到');

请注意我的date类型写法: date’2019-07-04’
然而存完后 存成了这样04-7月 -19
这是因为Oracle 默认的显示格式是 DD-MON-YY
这就不太好了,存成这样不好看啊
幸好Oracle中提供强大的转化函数 TO_CHAR(date, ‘YYYY-MM-DD’) 可以将date类型转化为自己想要的类型

SELECT TO_CHAR(startdate, 'YYYY-MM-DD') AS startdate FROM publiclesson;--2019-07-04

这样是不是太累了,每次都要转化一下,就没有简单的方法吗?
设置Oracle默认格式

ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';--设置Oracle的默认date格式

设置完默认格式,就可以将date直接存,直接取了;感觉整个世界都清静了有木有

INSERT INTO publiclesson VALUES('01','2019-07-04','暑期安全讲座','吴永勤','学生会','扇形报告厅','全体暑期留校人员都要参加','点到');
SELECT startdate FROM publiclesson;

用Java语言往Oracle存date

先试探性的看了下PreparedStatement中有没有setdate()这种方法,当我看到
void setDate(int parameterIndex, java.sql.Date x) throws SQLException; 我放心了,应该能玩起来
添加代码(包含日期类型)

public int addPublicLesson(PublicLesson lesson) {
		Connection conn = DBUtilDruid.getConnection();
		PreparedStatement pstm = null;
		int count = 0;
		String sql = "INSERT INTO publiclesson VALUES(?,?,?,?,?,?,?,?)";
		try {
			pstm = conn.prepareStatement(sql);
			pstm.setString(1, lesson.getId());
			pstm.setDate(2, lesson.getStartdate());
			pstm.setString(3, lesson.getTech_title());
			pstm.setString(3, lesson.getTech_title());
			pstm.setString(4, lesson.getSpeaker());
			pstm.setString(5, lesson.getOrganizer());
			pstm.setString(6, lesson.getAddress());
			pstm.setString(7, lesson.getGroup_note());
			pstm.setString(8, lesson.getRemark());
			count = pstm.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtilDruid.close(conn, pstm);
		}
		return count;
	}

测试一下
这里不得不说下,因为不知道怎么声明date类型特意查了API文档,看了下有关时间的有三个分别是Date Time Timestamp,结果发现他们三兄弟的构造方法都被弃用了,好坑啊,都到这儿了。本着不能放弃的精神,写了以下测试代码

@Test
	public void testAddPulicLesson() {
		Date date = new Date(2019,7,5);
		PublicLesson lesson = new PublicLesson("01",date,"暑期安全讲座","吴永勤","学生会","扇形报告厅","全体暑期留校人员都要参加","点到");
		logger.info(ipld.addPublicLesson(lesson));
	}

测试成功(添加了一条记录)
然而打开数据库想验证下,瞬间傻眼了,这是什么?3919-07-05
静下来一分析,只有年不对呀,我也没写差呀
突然脑子一闪,应该 原始时间不是从0开始的 一看API果不其然,人家 从1970年1月1日开始的
难道我每次都要减个差值吗?那也太累了?
又看了下API,看到了 static Date valueOf(String s)将JDBC日期转义格式的字符串转换为 Date值,这应该就是没差值的方法了吧
再试一把
结果OK,没问题,看来人家弃用构造方法没毛病啊

看看别人的做法

感觉我的做法很复杂,Oracle中存date,Java中放date,而这两个date匹配度太差,导致有很多不必要的操作
网上搜索了一下,果然有大佬
利用Oracle中内置方法 **to_date(String s, 'yyyy-mm-dd ')**可以不用将java中存储出date类型,用String操作,简化了对date类型的操作

// 修改程序
String sql = "INSERT INTO publiclesson VALUES(?,to_date(?, 'yyyy-mm-dd'),?,?,?,?,?,?)";
pstm.setString(2, lesson.getStartdate());//注意我这里是String类型的
// 测试时直接传String字符串就行
PublicLesson lesson = new PublicLesson("01","2019-07-05","暑期安全讲座","吴永勤","学生会","扇形报告厅","全体暑期留校人员都要参加","点到");
// 检索SQL也是如此
String sql = "SELECT speaker,organizer FROM publiclesson WHERE startdate = to_date(?, 'yyyy-mm-dd')";

一点小问题还是补充下吧,SELECT to_char(startdate,'yyyy-mm-dd') a,speaker,organizer FROM publiclesson这种语句检索出来的数据带有时分秒,但我的数据库中没有放,所以不想让他显示
下面给出解决方案

String sql = "SELECT to_char(startdate,'yyyy-mm-dd') startdate,speaker,organizer FROM publiclesson;// 注意我的别名,不写汇报错的

上边的to_char(x,x)很好理解,从数据库中读数据以一定格式显示,关键是这个操作把列名改了,所以我们要把列名给更正回去

好了,就到这里了,总结一下

总结

往Oracle中存date目前已有两种方法了:

  1. 踩坑踩出来的方法一,数据库存date,Java中存date(java.sql.date),其中使用到了valueOf(),缺点很明显,操作复杂
  2. 网上搜索到的方法二(我很看好),数据库存date,Java中存String, 其中用到了Oracle的内置函数to_char和to_date,在Java中操作变简单了,都是操作String或int

做完了,坑也踩得差不多了,相信下次开发时遇到绝对溜溜的

内容概要:本文针对高比例清洁能源接入背景下配电网重构的关键问题,结合需求响应机制开展深入研究,以IEEE33节点标准系统为算例,采用Matlab进行建模与仿真分析。研究充分考虑风电、光伏等分布式电源出力的不确定性特征以及需求侧响应对系统运行的影响,构建了以降低网络损耗、改善电压质量、提升清洁能源消纳能力为目标的优化模型。通过引入智能优化算法求解网络中最优的开关操作策略,实现配电网拓扑结构的动态重构,并通过仿真结果验证了所提方法在增强系统灵活性、可靠性和经济性方面的有效性与优越性。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力,从事新能源并网、智能配电网、需求响应、分布式能源管理等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于高渗透率可再生能源接入的主动配电网运行优化;②支撑需求响应机制下电网灵活性资源的协同调控研究;③为现代低碳、高效、自愈型智能配电网的规划与运行提供技术路径与决策支持。; 阅读建议:建议读者结合文中提供的Matlab代码与IEEE33节点系统参数进行实践复现,深入掌握配电网重构的数学建模方法、约束处理技巧及智能算法求解流程,同时可进一步拓展至多目标优化、不确定性建模(如鲁棒优化、分布鲁棒优化)及动态重构等前沿方向的研究。
内容概要:本文研究了基于条件风险价值(CVaR)的虚拟电厂与电动汽车集群之间的主从博弈优化调度问题,旨在应对电力系统中可再生能源出力与负荷需求的不确定性。通过构建主从博弈模型,将虚拟电厂作为领导者制定电价策略,电动汽车集群作为跟随者响应调度指令,结合CVaR方法量化不同风险偏好的决策行为,有效提升了系统在极端场景下的鲁棒性与经济性。研究采用Matlab进行模型编程与仿真,实现了对多主体互动行为的优化调度,并通过算例验证了所提出模型在降低运行成本、提高新能源消纳能力以及增强风险管控方面的优越性能。该方法为高比例可再生能源接入背景下电力系统的协调运行提供了理论支持和技术路径。; 适合人群:具备一定电力系统、优化理论及博弈论基础知识,从事能源互联网、综合能源系统、电动汽车调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于虚拟电厂参与电力市场环境下的定价与调度决策;②指导大规模电动汽车集群在不确定性条件下的有序充放电管理;③为含高比例可再生能源的电力系统提供风险规避型优化调度方案。; 阅读建议:学习者应掌握Matlab编程基础,熟悉YALMIP+CPLEX等优化工具箱的使用,结合文中模型结构与代码实现,重点理解主从博弈的建模逻辑、CVaR的风险刻画机制以及多目标优化的求解流程,建议自行复现算例以加深理解。
内容概要:本文针对2MW大功率虚拟同步发电机(VSG)的惯量与阻尼特性,开展并网逆变系统的Simulink仿真研究,系统构建了VSG的核心控制模型,深入分析其在并网过程中的动态响应特性、系统稳定性以及对电网惯性和阻尼支撑能力的作用机制。研究通过仿真手段验证了VSG有效模拟传统同步发电机机械动态特性的可行性,重点探讨了惯量、阻尼等关键控制参数对系统暂态性能和抗扰动能力的影响规律,旨在为提升高比例新能源接入背景下电力系统的频率稳定性和电压支撑能力提供有效的技术路径与仿真依据。; 适合人群:具备电力电子、电力系统分析及自动控制理论基础,从事新能源并网技术、微电网控制、虚拟同步机(VSG/VSM)等领域研究的研究生、科研人员及电力系统相关工程技术人员。; 使用场景及目标:①深入理解虚拟同步发电机模拟传统同步机转动惯量与阻尼的物理机理与数学建模方法;②掌握利用Simulink搭建VSG并网逆变器详细仿真模型的关键技术;③通过仿真分析惯量和阻尼系数对系统动态响应(如频率波动、功率振荡)的影响,实现控制器参数的优化设计;④为解决弱电网条件下新能源并网的稳定性问题提供仿真验证平台和技术参考。; 阅读建议:学习者应熟练掌握Simulink/Matlab仿真环境,建议结合文中所述的VSG控制策略与系统拓扑结构,动手复现完整的仿真模型,并通过设置不同工况(如负载突变、电网电压波动)和调整控制参数,对比观察系统响应曲线,从而深刻理解VSG的控制特性、优势及其在现代电力系统中的应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值