Estoy tratando de ejecutar una consulta de la siguiente forma con jooq en Kotlin:
val create = DSL.using(SQLDialect.POSTGRES) val query: Query = create.select().from(DSL.table(tableName)) .where(DSL.field("timestamp").between("1970-01-01T00:00:00Z").and("2021-11-05T00:00:00Z")) .orderBy(DSL.field("id").desc())El código de arriba me da:
syntax error at or near \"and\ Además, al observar esta consulta en el depurador, query.sql muestra como:
select * from data_table where timestamp between ? and ? order by id desc No estoy seguro si el ? indica que no pudo representar los valores en SQL o de alguna manera son algún tipo de marcadores de posición.
Además, el código funciona sin la cadena where .
Además, en la línea de comando de Postgres puedo ejecutar lo siguiente y la consulta se ejecuta:
select * from data_table where timestamp between '1970-01-01T00:00:00Z' and '2021-11-05T00:00:00Z' order by id Al consultar los tipos de datos en el esquema, el tipo de columna de timestamp de tiempo se representa como timestamp without time zone .
Antes había declarado variables como:
val lowFilter = "1970-01-01T00:00:00Z" val highFilter = "2021-11-05T00:00:00Z"y esto no funcionó y parece que pasar cadenas sin procesar tampoco funciona. Soy muy nuevo en esto, así que estoy bastante seguro de que estoy estropeando el uso aquí.
EDITAR Siguiendo la sugerencia de @nulldroid, hizo algo como:
.where(DSL.field("starttime").between(DSL.timestamp("1970-01-01T00:00:00Z")).and(DSL.timestamp("2021-11-05T00:00:00Z")))y esto resultó en:
Type class org.jooq.impl.Val is not supported in dialect POSTGRES"Voy a suponer que tiene una buena razón para no usar el generador de código para esta consulta en particular, la razón principal suele ser que su esquema es dinámico.
Entonces, la forma correcta de escribir su consulta es esta:
create.select() .from(DSL.table(tableName)) // Attach a DataType to your timestamp field, to let jOOQ know about this .where(DSL.field("timestamp", SQLDataType.OFFSETDATETIME) // Use bind values of a temporal type .between(OffsetDateTime.parse("1970-01-01T00:00:00Z")) .and(OffsetDateTime.parse("2021-11-05T00:00:00Z"))) .orderBy(DSL.field("id").desc())Observe cómo estoy usando tipos de datos temporales reales, no cadenas para comparar fechas y declarar campos.
Supongo, según las marcas de tiempo UTC de su pregunta, que está usando TIMESTAMPTZ . De lo contrario, si está utilizando TIMESTAMP , simplemente reemplace OffsetDateTime por LocalDateTime ...
Si usa el generador de código, que siempre se recomienda si su esquema no es dinámico, escribiría casi lo mismo que arriba, pero escriba con seguridad:
create.select() .from(MY_TABLE) // Attach a DataType to your timestamp field, to let jOOQ know about this .where(MY_TABLE.TIMESTAMP // Use bind values of a temporal type .between(OffsetDateTime.parse("1970-01-01T00:00:00Z")) .and(OffsetDateTime.parse("2021-11-05T00:00:00Z"))) .orderBy(MY_TABLE.ID.desc())