我使用的是oracle数据库,列数如下
START_TIME INTERVAL DAY(0) TO SECOND(0)
我在java代码中使用jdbc模板来使用行映射器和getString()方法访问这个值,就像下面这样。(我正在运行一个基本的选择查询来从DB中获取值)
String startTime = rs.getString("START_TIME");
而我得到的值是这样的格式
System.out.println(startTime); // 0 9:30:0.0
我无法将这个值格式化,在 HH:MM 格式字符串。我不需要秒,因为我忽略了这个值。所以我想要的是这样的 09:30
找到了这个,看起来很像 但我正在使用swagger开放API基于yaml的生成DTO,不知道如何才能实现。另外,我没有使用hibernate。是普通的JDBC模板。
EDIT: 观察到当我有 +00 11:00:00.000000
在数据库中, rs.getString("START_TIME")
获取 0 11:0:0.0
而当 +00 09:30:00.000000
它获取 0 9:30:0.0
但我的要求是 11:00
和 09:30
. 希望这对你有帮助。
我认为操作字符串值是最简单、最容易的解决方法,所以我将提出另一种解决方案。
从Oracle文档中的 INTERVAL DAY TO SECOND数据类型 而从列的定义来看 START_TIME
在你的问题中,列值不能超过一天,也不能包含小数点的秒。
从Oracle JDBC文档,数据类型 INTERVAL DAY TO SECOND
映射到java类 oracle.sql.INTERVALDS
. 这是Oracle JDBC驱动JAR文件中的一个类)。
从 javadoc 级别的 oracle.sql.INTERVALDS
:
该对象的内部数据以11个字节的阵列形式存储在超级类的存储区。字节排列如下。
Byte Represents 0 High byte of day 1 2nd high byte of day 2 3rd high byte of day 3 least byte of day 4 hour val + 60 5 min + 60 6 sec + 60 7 High byte of Fractional second 8 2nd high byte of Fractional Second 9 3rd high byte of Fractional Second 10 least byte of Fractional Second
你知道只有字节4、5、6是相关的,因为列的定义是: START_TIME
即零天和零分秒。但由于你在问题中写道你忽略了秒,这意味着只有字节4和5是相关的。因此,从寄存器中检索值的代码是这样的 ResultSet
并将其转换为您所需格式的字符串。
INTERVALDS intervalDS = (INTERVALDS) rs.getObject("START_TIME");
byte[] bytes = intervalDS.toBytes();
int hour = bytes[4] - 60;
int minute = bytes[5] - 60;
String result = String.format("%02d:%02d", hour, minute);
找出从第一个空格字符后到第二个空格字符的子串。:
冒号字符,并用0左键填充,使其长度为5个字符。
public static String getHoursMinutesFromInterval( final String time )
{
String hhmm = time.replaceAll( "^0 (\\d{1,2}:\\d{2}):\\d+\\.\\d+$", "0$1" );
if ( hhmm.length() > 5 )
{
hhmm = hhmm.substring(1, 6);
}
return hhmm;
}