如何使用Java Sping Boot 从Oracle中获取AM的日期时间

jutyujz0  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(63)

这是我的代码:

List<ReqBody> records = soaDB.query(
                " SELECT TSTMP FROM .... A\r\n"
                        new RowMapper<ReqBody>() {
                            @Override
                            public ReqBody mapRow(ResultSet rs, int rowNum) throws SQLException {   
                                log.info("ddddddddddddd: {}", rs.getString("TSTMP"));
                                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a", Locale.ENGLISH);
                                LocalDateTime dateTime = LocalDateTime.parse(rs.getString("TSTMP"), formatter);
                                
                                
                                log.info("dateStr: {}", dateTime);

                                ReqBody e = ReqBody.builder()
                                        
                                        .Tstmp(dateTime)

                                        .build();

                                log.info("eeeeeeeeeeeeee {}",e);

                                return e;
                            }

                        });

字符串
我想从数据库中获得完整的格式,即:26-DEC-23 10.00.00.000000 AM,但我只获得了日期和时间,而没有AM(2023-12-26 10:00:00)为什么?有办法获得完整的格式吗?

agxfikkp

agxfikkp1#

在Oracle中,TIMESTAMP是一种二进制数据类型,由7-13个字节组成,表示世纪、世纪年、月、日、小时、分钟、秒,0-6个字节表示小数秒(取决于精度)。它始终具有这些组件,并且从不以任何特定的人类可读格式存储。
我想从数据库中获取完整的格式,即:26-DEC-23 10.00.00.000000 AM
不,它不是以这种格式存储的;如前所述,存储在数据库中的格式是二进制的,没有人类可读的格式。
如果你想查看存储在数据库中的字节值,那么你可以使用:用途:

SELECT DUMP(timestamp_column) FROM table_name;

字符串
但是,当我通过客户端应用程序(即SQLPlus、SQL Developer等)SELECT列时,我看到的数据格式为26-DEC-23 10.00.00.000000 AM
这与数据库无关,数据库将向您正在使用的客户端应用程序发送原始二进制值;客户端应用程序决定如何以有意义的方式显示日期-时间值。
对于SQL
Plus(以及SQL Developer和SQLCl),默认日期格式取决于您的数据库认为它位于哪个国家/地区(即数据库或会话的NLS_TERRITORY设置)。
您可以使用以下命令查看默认格式:

SELECT value
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_TIMESTAMP_FORMAT';


在你的例子中,输出:
| 值|
| --|
| DD-MON-RR HH12.MI.SS.FF6 AM|
在其他客户端应用程序中,您需要查看该特定客户端的文档,以了解如何设置默认日期-时间格式。
我只得到日期和小时,没有上午(2023-12-26 10:00:00)为什么?
在Java中,您使用rs.getString("TSTMP")来获取TIMESTAMP值,因此客户端应用程序获取二进制值并将其隐式转换为YYYY-MM-DD HH24:MI:SS的字符串(使用等效的Oracle格式模型)。
如果你想将值解析为字符串,那么不要发送TIMESTAMP并允许Java隐式转换为字符串;而是从Oracle发送格式化的字符串:

SELECT TO_CHAR(
         TSTMP,
         'DD-MON-RR HH12.MI.SS.FF6 AM',
         'NLS_DATE_LANGUAGE=English'
       ) AS tstmp
FROM   table_name


然而,在Java中,你可能想做的是使用你当前的查询,并将值作为TIMESTAMP(而不是字符串)传递,然后read the value as a LocalDateTime(而不是字符串):

LocalDateTime dateTime = rs.getObject("TSTMP", LocalDateTime.class);


然后你可以在Java中任意格式化它。

相关问题