Hi Raffael,

>From a quick look, your implementation looks quite interesting and valid.
Maybe here:

    @Override
    public void toSQL(RenderContext context) {
        context.sql("{fn TIMESTAMPADD(" + interval + ", ");
        context.sql(context.render(count));
        context.sql(", ");
        context.sql(context.render(timestamp));
        context.sql(")}");
    }

You could keep it simple and do this instead:

@Override
public void toSQL(RenderContext context) { context.sql("{fn
TIMESTAMPADD(" +interval
+ ", "); context.visit(count); context.sql(", ");
context.visit(timestamp);context
.sql(")}"); }

Also, note that jOOQ supports the SQL standard INTERVAL data types:
http://www.jooq.org/doc/3.2/manual/reference/reference-data-types/data-types-intervals/

So you might actually use those along with the regular Field.add() method,
as documented in the Javadoc:
http://www.jooq.org/javadoc/3.2.x/org/jooq/Field.html#add(org.jooq.Field)

Cheers
Lukas

2014-02-03 <[email protected]>:

> I'm looking for a way to call the JDBC function 
> timestampadd<http://db.apache.org/derby/docs/10.2/ref/rrefjdbc88908.html> in
> my queries built with jOOQ. The typical output SQL should look like:
>
> {fn timestampadd(SQL_TSI_YEAR, 5, CUSTOMER.BIRTH)}
>
> I implemented my solution by extending CustomField:
>
> public class JdbcTimestampAddField extends CustomField<Timestamp> {
>
>     private final String interval;
>     private final Field<Integer> count;
>     private final Field<Timestamp> timestamp;
>
>     public JdbcTimestampAddField(String interval, Field<Integer> count, 
> Field<?> timestamp) {
>         super("timestampadd", SQLDataType.TIMESTAMP);
>         this.interval = interval;
>         this.timestamp = timestamp.cast(SQLDataType.TIMESTAMP);
>         this.count = count;
>     }
>
>     public JdbcTimestampAddField(String interval, Field<Integer> count, Date 
> timestamp) {
>         this(interval, count, val(timestamp));
>     }
>
>     public JdbcTimestampAddField(String interval, int count, Field<?> 
> timestamp) {
>         this(interval, val(count), timestamp);
>     }
>
>     public JdbcTimestampAddField(String interval, int count, Date timestamp) {
>         this(interval, count, val(timestamp));
>     }
>
>     @Override
>     public void toSQL(RenderContext context) {
>         context.sql("{fn TIMESTAMPADD(" + interval + ", ");
>         context.sql(context.render(count));
>         context.sql(", ");
>         context.sql(context.render(timestamp));
>         context.sql(")}");
>     }
>
>     @Override
>     public void bind(BindContext context) throws DataAccessException {
>         context.visit(count);
>         context.visit(timestamp);
>     }
> }
>
>
> and building my own DerbyDsl namespace:
>
> public class DerbyDsl {
>
>     public static Field<Timestamp> timestampAdd(Field<Integer> yearsCount, 
> Field<Integer> monthsCount, Field<Integer> daysCount, Field<?> timestamp) {
>         return timestampAddDays(daysCount, timestampAddMonths(monthsCount, 
> timestampAddYears(yearsCount, timestamp)));
>     }
>
>     public static Field<Timestamp> timestampAdd(int yearsCount, int 
> monthsCount, int daysCount, Field<?> timestamp) {
>         return timestampAdd(val(yearsCount), val(monthsCount), 
> val(daysCount), timestamp);
>     }
>
>     public static Field<Timestamp> timestampAddYears(Field<Integer> count, 
> Field<?> timestamp) {
>         return new JdbcTimestampAddField("SQL_TSI_YEAR", count, timestamp);
>     }
>
>     public static Field<Timestamp> timestampAddMonths(Field<Integer> count, 
> Field<?> timestamp) {
>         return new JdbcTimestampAddField("SQL_TSI_MONTH", count, timestamp);
>     }
>
>     public static Field<Timestamp> timestampAddDays(Field<Integer> count, 
> Field<?> timestamp) {
>         return new JdbcTimestampAddField("SQL_TSI_DAY", count, timestamp);
>     }}
>
>
> Is there a better way to solve this problem? Did I make any mistake in my
> implementation that pass my tests but are waiting in the shadows to screw
> everything up?
>
> --
> You received this message because you are subscribed to the Google Groups
> "jOOQ User Group" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
You received this message because you are subscribed to the Google Groups "jOOQ 
User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to