【问题标题】:Is there a way to use TIMESTAMP_WITH_TIMEZONE as a Function input in Oracle有没有办法在 Oracle 中使用 TIMESTAMP_WITH_TIMEZONE 作为函数输入
【发布时间】:2020-08-10 13:12:54
【问题描述】:

我正在尝试创建一个接受 TIMESTAMP_WITH_TIMEZONE 值作为输入参数的 Oracle SQL 函数。

CREATE FUNCTION my_func ( timetz IN TIMESTAMP WITH TIMEZONE ) // Not going to work 
   // code here
   BEGIN 
      // code here
   END;

然后尝试如下传递输入。我正在尝试将用户提供的不同时区设置为 ZonedDateTime 值。以下代码以当前LocalDateTime为例。

public void myFunc( )
{
    CallableStatement stmt = con.prepareCall("{call my_func ( ? )}");  
    stmt.setObject( ZonedDateTime.of( LocalDateTime.now() ), java.sql.Types.TIMESTAMP_WITH_TIMEZONE);  
    stmt.execute(); 
}

理想的方法是什么。

【问题讨论】:

  • JDBC 规范只为TIMESTAMP_WITH_TIME_ZONE 定义了对java.time.OffsetDateTime 的支持。

标签: java sql oracle


【解决方案1】:

想出了一个方法来做到这一点。万一有人在这个问题上需要帮助,我会发布我使用的解决方法。

  1. 将带有时区的日期作为 VARCHAR2 传递给函数

    创建函数 my_func ( timetz IN VARCHAR2 ) // 这里的代码 开始 // 用法 TO_TIMESTAMP_TZ(timetz, 'YYYY-MM-DD HH24:MI:SS TZR') 结束;

  2. 从 java 传递带时区的时间戳作为字符串

    SimepleDateFormatter sdf = new SimpleDateFormatter('yyyy-mm-dd HH:mm:ss') sdf.format(new Timestamp()) + " " + "太平洋/美国"

    stmt.setString(1, timestampTZString);

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多