Как сравнить месяцы / дни в Kotlin Exposed? - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь запросить события в SQL Server, которые находятся в пределах периода времени, но отбрасывают год, потому что я ищу ежегодные события. Я пытаюсь построить запрос, сравнивая месяцы и дни месяца с их целочисленными эквивалентами, но, похоже, не существует способа.

С типами столбцов Column<DateTime> вы можете сравнить сlessEq / greaterEq. Однако, если я просто хочу сравнить месяцы, использование columnDate.month() возвращает Expression и не относится к типу Column, и lessEq / greaterEq эквивалентов не существует.

Другая проблема заключается в том, что даже нет функции расширения monthDay. К счастью, это проще в управлении, так как это будет то же самое, что и функция месяца с небольшим изменением:

fun <T: DateTime?> Expression<T>.monthDay() = DayOfMonth(this)

class DayOfMonth<T:DateTime?>(val expr: Expression<T>): Function<Int>(IntegerColumnType()) {
        override fun toQueryBuilder(queryBuilder: QueryBuilder) = queryBuilder { append("DAY(", expr,")") }
}

Цель для меня слишком в конечном итоге получить выражение типа TableName.dateColumnName.betweenIgnoreYear(startDate, endDate) return Op<Boolean>. Есть ли способ сделать это?

1 Ответ

1 голос
/ 23 октября 2019

Вы были на полпути к правильному коду:

class BetweenIgnoreYear<T:DateTime?>(
     val expr: Expression<T>, 
     val from: Expression<T>, 
     val to: Expression<T>) : Op<Boolean>() 
{
    override fun toQueryBuilder(queryBuilder: QueryBuilder) = queryBuilder {
        append(expr.monthDay(), " BETWEEN ", from.monthDay(), " AND ", to.monthDay())
    }
}


fun <T: DateTime?> Expression<T>.betweenIgnoreYear(startDate : Expression<T>, endDate : Expression<T>) 
    = BetweenIgnoreYear(this, startDate, endDate)
...