方解石中无法解析TO_TIMESTAMP函数

问题描述 投票:0回答:2

我正在使用方解石库使用 API 查询我的数据,我发现名为 TO_TIMESTAMP 的函数https://calcite.apache.org/docs/reference.html但是当我调用它时给出异常,没有具有此签名的函数

我尝试做什么:

SELECT TO_TIMESTAMP(cast(ORGINALTIMESTAMP as varchar),cast('yyyy-MM-dd HH:mm:ss' as varchar)) as  TEST from my_table

我得到的例外:

未找到函数签名 TO_TIMESTAMP(, ) 的匹配项

知道我做错了什么吗?

apache-calcite
2个回答
1
投票

要解决此问题,请在用于连接到 Calcite 的 JDBC 连接字符串中包含

fun=postgresql
,该字符串以
jdbc:calcite:
开头。

在方解石中,

TO_TIMESTAMP
是特定于方言的运算符。这意味着它不包含在默认方言中,这就是它出现在 Calcite 方言特定运算符表中的原因。

TO_TIMESTAMP
的“c”(兼容性)列包含值“o p”,这意味着在 Oracle 和 PostgreSQL 函数表中启用了
TO_TIMESTAMP
。这就是为什么
fun=postgresql
解决了问题;
fun=oracle
也可以。


0
投票

TO_TIMESTAMP 不起作用...它会导致 java.lang.RuntimeException: 无法翻译调用 TO_TIMESTAMP($t1, $t2)

PARSE_TIMESTAMP 效果很好

import org.apache.calcite.adapter.jdbc.JdbcSchema;
import org.apache.calcite.avatica.util.Casing;
import org.apache.calcite.config.CalciteConnectionProperty;
import org.apache.calcite.jdbc.CalciteConnection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.calcite.jdbc.Driver;
import org.apache.calcite.schema.SchemaPlus;
import javax.sql.DataSource;

public class Test {
    public static void main(String[] args) throws SQLException {
        CalciteConnection connection = initCalciteConnection();

        DataSource oracleDataSource1 = JdbcSchema.dataSource(
                "jdbc:oracle:thin:@//<ip>:<port>/<service>",
                "oracle.jdbc.OracleDriver",
                "<user>",
                "<password>"
        );

        String schemaName = "oracle_1";
        SchemaPlus rootSchema = connection.getRootSchema();
        JdbcSchema jdbcSchema = JdbcSchema.create(rootSchema, schemaName, oracleDataSource1, null, "<schema>");
        rootSchema.add(schemaName, jdbcSchema);

//        String sql = """
//            SELECT PARSE_TIMESTAMP('%d.%m.%Y %H:%M:%S', '01.01.2024 00:00:00')
//        """;

        String sql = """
            SELECT TO_TIMESTAMP('2024-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
        """;

        ResultSet resultSet = connection.createStatement().executeQuery(sql);

        while (resultSet.next()) {

            for (int i=1; i <= resultSet.getMetaData().getColumnCount(); i++) {
                System.out.println(resultSet.getString(i));
                System.out.println(" ");
            }
            System.out.println(" ");
        }
    }

    private static CalciteConnection initCalciteConnection() throws SQLException {
        DriverManager.registerDriver(new Driver());
        Properties properties = new Properties();
//        properties.putIfAbsent(CalciteConnectionProperty.FUN.camelName(), "oracle,postgresql,bigquery");
        properties.putIfAbsent(CalciteConnectionProperty.FUN.camelName(), "all");
        properties.putIfAbsent(CalciteConnectionProperty.CASE_SENSITIVE.camelName(), "false");
        properties.putIfAbsent(CalciteConnectionProperty.QUOTED_CASING.camelName(), Casing.UNCHANGED.name());
        properties.putIfAbsent(CalciteConnectionProperty.UNQUOTED_CASING.camelName(), Casing.UNCHANGED.name());

        return DriverManager.getConnection("jdbc:calcite:", properties).unwrap(CalciteConnection.class);
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.