按月份(整数)和年份(整数)比较日期范围

Compare date Range by Month (Integer) and Year (Integer)

我在比较日期范围时遇到问题。我必须验证特定月份和年份内的日期。月份和年份是整数值。

注意:我通过 Oracle 数据库使用 OUTSYSTEMS 聚合

查询的两个结果示例:

    Start Date    End Date 
1   2020-08-16    2020-10-14
2   2019-11-01    2020-08-15

案例一

输入:

Month = 9
Year = 2020

预期结果:

    Start Date    End Date 
1   2020-08-16    2020-10-14

案例二

输入:

Month = 8
Year = 2020

预期结果:

    Start Date    End Date 
1   2020-08-16    2020-10-14
2   2019-11-01    2020-08-15

案例三

输入:

Month = 3
Year = 2020

预期结果:

    Start Date    End Date 
2   2019-11-01    2020-08-15

案例4

输入:

Month = 10
Year = 2019

预期结果:无行

选择的方式是Java。我使用像 Month() 和 Year() 这样的系统函数将行转换为整数。

像这样

((Month(StartDate) <= Month and Month(EndDate) = Month)
and
(Year(StartDate) <= Year and Year(EndDate) = Year))
or
((Month(StartDate) <= Month and Month(EndDate) = Month)
and
(Year(StartDate) <= Year and Year(EndDate) = Year))

上面的代码不起作用。我尝试了很多组合都没有成功。我没有特殊的比较功能。对于我的分析,我创建了四个场景来显示我正在研究的月份和年份中包含的日期。但我没有让代码工作。有人可以为我指明方向

一个简单的方法使用算术:

where year * 100 + month 
    between year(startdate) * 100 + month(startdate)
        and year(enddate)   * 100 + month(enddate)

然而,这可能不是最有效的方法。通常,您希望避免在您筛选的列上应用函数。更好的替代方法是将 year/month 参数转换为日期 - 不幸的是你没有标记你的数据库,并且日期函数是高度 vendor-specific,所以实际上不可能建议。

如果你不想between:

where year * 100 + month >= year(startdate) * 100 + month(startdate)
  and year * 100 + month <= year(enddate)   * 100 + month(enddate)

这个有用吗?考虑到您输入 m 月份和 y 年份:

StartDate <= AddDays(AddMonths(NewDate(Year(y), Month(m), 1),1)-1)
and
EndDate >= NewDate(Year(y), Month(m), 1))

思路是这样的:过滤所有小于输入月份最后一天的开始日期和所有大于输入月份第一天的结束日期。

关于性能,使用这种方法,您不必对要过滤的列执行任何操作logic/filter。

vendor-independent 解决方案

GMB 的回答很好,如果是我,我会同意的。正如 GMB 所说,它是特定于供应商的,因为日期函数是。如果您想要一个跨数据库供应商的解决方案,请在 Java 中进行日期数学运算,这样您只需要在数据库中进行简单的日期比较。

    int month = 8;
    int year = 2020;

    YearMonth ym = YearMonth.of(year, month);
    LocalDate monthStart = ym.atDay(1);
    LocalDate monthEnd = ym.atEndOfMonth();

当您将这些日期传递给您的查询时,您的搜索条件可能会很简单:

  where startDate <= monthEnd and endDate >= monthStart