如何比较暴露的Kotlin中的月/日?

时间:2019-10-22 17:20:53

标签: sql-server kotlin-exposed

我正在尝试查询SQL Server中某个时间范围内的事件,但由于寻找年度事件而放弃了年份。我正在尝试通过将月份和月份与它们的整数等效项进行比较来构建查询,但似乎没有办法。

在列类型为Column<DateTime>的情况下,您可以与lessEq / greaterEq进行比较。但是,如果我只是想比较月份,则使用columnDate.month()会返回Expression且不是Column类型,并且没有lessEq / {{1} }等价物。

另一个问题是,甚至没有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)。有什么办法吗?

1 个答案:

答案 0 :(得分:1)

UPD:自0.19.1起,“暴露”中存在月份/天/等功能

您只是正确代码的一半:

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)