0

我正在尝试查询 SQL Server 中某个时间范围内但丢弃年份的事件,因为我正在寻找年度事件。我正在尝试通过将月份和月份天数与其整数等价物进行比较来构建查询,但似乎没有办法。

对于 的列类型Column<DateTime>,您可以与lessEq/进行比较greaterEq。但是,如果我只是想比较月份,则 usingcolumnDate.month()返回一个Expressionand 不是 type 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 an这样的表达式Op<Boolean>。有没有办法做到这一点?

4

1 回答 1

1

UPD:自 0.19.1 以来,Exposed 中有月/日/等功能

您只是正确代码的一半:

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)
于 2019-10-23T10:09:33.537 回答