【问题标题】:Given 2 LocalDateTime generate filters based on days or days/hours给定 2 LocalDateTime 基于天或天/小时生成过滤器
【发布时间】:2019-04-05 04:27:12
【问题描述】:

我想要一个方法,给定一个时间间隔粒度(例如 DAY、HOUR 等)和 2 个 LocalDateTime ab 生成一个字符串以下类型:

假设给定的时间间隔为a = '2018-01-01 12:23:23'b = '2018-01-10 15:18:13'

  • DAY:a 和 b 舍入为天,输出为字符串 "d >= '2018-01-01' and d <= '2018-01-10"
  • HOUR => 这里的粒度是小时,所以a和b四舍五入到小时,字符串为"(d == '2018-01-01' and h >= 12) or (d >= '2018-01-02' and d <= '2018-01-09') or (d == '2018-01-10 and h <= 15)"

现在,我只需要这两种情况,但我想灵活一点(假设我想在未来用分钟做同样的事情)

我找不到这样做的聪明方法,例如在 Java 中使用 Duration 类,但我只能硬编码上述两个粒度的结果

【问题讨论】:

  • 祝您一切顺利。您是否碰巧有一个问题要问我们?
  • d >= '2018-01-01' and d <= '2018-01-10是你要返回的字符串吗?
  • 我修改了问题,希望现在更清楚

标签: java datetime timestamp timestamp-with-timezone localdate


【解决方案1】:

您为什么认为使用Duration 会是一种“聪明的方式”?它不是。您的两个 LocalDateTime 对象具有构建文本结果所需的所有值。

例子:

public enum Granularity { DAY, HOUR }
public static String toSqlCondition(LocalDateTime min, LocalDateTime max, Granularity granularity) {
    switch (granularity) {
        case DAY:
            return "d >= '" + min.toLocalDate() + "' and d <= '" + max.toLocalDate() + "'";
        case HOUR:
            return "(d == '" + min.toLocalDate() + "' and h >= " + min.getHour() + ") or " +
                   "(d >= '" + min.toLocalDate().plusDays(1) + "' and d <= '" + max.toLocalDate().minusDays(1) + "') or " +
                   "(d == '" + max.toLocalDate() + "' and h <= " + max.getHour() + ")";
        default:
            throw new UnsupportedOperationException("Cannot build SQL condition with granularity " + granularity);
    }
}

测试

LocalDateTime a = LocalDateTime.parse("2018-01-01T12:23:23");
LocalDateTime b = LocalDateTime.parse("2018-01-10T15:18:13");
System.out.println(toSqlCondition(a, b, Granularity.DAY));
System.out.println(toSqlCondition(a, b, Granularity.HOUR));

输出

d >= '2018-01-01' and d <= '2018-01-10'
(d == '2018-01-01' and h >= 12) or (d >= '2018-01-02' and d <= '2018-01-09') or (d == '2018-01-10' and h <= 15)

【讨论】:

  • 对!如果我们有同一天或同一天同一小时怎么办?我们将有多余的过滤器。另外,如果我想插入几分钟,我必须再次对其进行硬编码,对吗?
  • @alexlipa 如果您想在输入同一天的情况下优化结果,那么无论如何您都必须为此编写代码,因为结果会有所不同。如果你想要MINUTE 的粒度,结果条件会有所不同,所以也必须对所有这些进行编码。你不会免费获得任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多