Поскольку вопрос касается решения в Java или Groovy, кто-то может найти здесь решение для Java (точно так же, как я)
Ниже вы можете увидеть простую функцию, которая проверяет, если указанные даты находятся в тот же день:
public class IsSameDay extends Function {
@Override
protected void xFunc() throws SQLException {
if (args() != 2) {
throw new SQLException("IsSameDay(date1,date2): Invalid argument count. Requires 2, but found " + args());
}
try {
DateTime t1 = DateTime.parse(value_text(0).replace(" ", "T"));
DateTime t2 = DateTime.parse(value_text(1).replace(" ", "T"));
if (t1.getYear() == t2.getYear() && t1.getDayOfYear() == t2.getDayOfYear()) {
result(1);
} else {
result(0);
}
} catch (Exception exception) {
throw new SQLDataException("IsSameDay(date1,date2): One of Arguments is invalid: " + exception.getLocalizedMessage());
}
}
}
и если кому-то нужно выполнить функцию агрегирования, этот пример может оказаться полезным:
public class MyMax extends Function.Aggregate {
private long buff = 0;
public MyMax() {
}
@Override
protected void xStep() throws SQLException {
long current = value_long(0);
if (current > buff) {
buff = current;
}
}
@Override
protected void xFinal() throws SQLException {
result(buff);
}
}
аккумулятор работает, потому что в каждом запросе экземпляр MyMax клонируется, поэтому начальное значение можетбыть предоставлено при создании экземпляра объекта.
в конце примера, показывающего, как прикреплять функции:
Function.create(c, IsSameDay.class.getSimpleName(), new IsSameDay());
Function.create(c, MyMax.class.getSimpleName(), new MyMax());
Надеюсь, что кто-то найдет его полезным.