【问题标题】:How to fetch Records for every month?如何获取每个月的记录?
【发布时间】:2018-02-13 10:12:21
【问题描述】:

我正在使用带有 Java 的 JDBC 来获取如下所示的帐户 ID 记录:

select s.account_id, s.status, o.phonenumber
from table1 s, table2 o
where s.valid_from='1-DEC-16'
  and o.phonenumber IS NOT NULL
  and s.validTo=sysdate 
  and s.status='active'
  and and s.account_id = o.account_id;

在结果集中,我正在获取活动记录的所有 accountid。有什么方法可以让我每个月执行这个查询并在每个月底输出帐户 ID?在那种情况下,我应该如何自动给出 valid_fromvalid_to 日期?

【问题讨论】:

  • 网上有很多调度程序可以让你自动化,包括 Linux 中的本机 cron。所以是的,有很多方法,请具体说明要求和环境,特别是您的项目。您可以使用new Date() 来获取valid_to 的当前日期,并使用Calendar 类中的Calendar.Add() 来获取valid_from 的一个月前的日期。如果您提供更多代码而不仅仅是查询,那将非常容易为您提供帮助。
  • 不要使用早已过时的DateCalendar,只需使用来自java.timeLocalDate,现代Java 日期和时间API。 See the tutorial here.。还有@Exception_al
  • 注明@OleV.V。 .但是 LocalDate 在 Java8+ 中不是新的吗?无论如何,OP 的问题仍然过于宽泛,无法提供任何帮助。
  • @Exception_al 对于 Java 6 和 Java 7,java.time 的大部分功能都在 ThreeTen-Backport 项目中向后移植。

标签: java date jdbc


【解决方案1】:

在与数据库交换数据时使用智能对象,而不是哑字符串。

使用 JDBC 4.2 或更高版本,您可以直接与数据库交换现代 java.time 对象。

对于仅日期值,请使用 LocalDate。要获取每月的第一天,请使用 YearMonth

ZoneId z = ZoneId.of( “Africa/Tunis” ) ;
YearMonth ym = YearMonth.now( z ) ;
LocalDate firstOfThisMonth = ym.atDay( 1 ) ;
LocalDate firstOfNextMonth = ym.plusMonths( 1 ).atDay( 1 ) ;

使用类似的 SQL:

… WHERE happened >= ? AND happened < ?

为该占位符传递一个值。

myPreparedStatement.setObject( 1 , firstOfMonth ) ;
myPreparedStatement.setObject( 2 , firstOfNextMonth ) ;

这种方法称为半开放,其中开头是包含,而结尾是排他。通常是定义时间跨度的最佳方式。请注意,对于这种方法,我们使用 SQL 运算符 BETWEEN,因为它是完全关闭的。

检索。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多