如何每月在表中将计数器列重置为零

时间:2017-12-12 11:15:58

标签: java date calendar scheduler

我有一个名为

的列

duty_counter存储每个月工作的人数。 reset_date存储上次重置日期。

我使用以下sql获取reset_date并将其设置为curr date

select distinct TO_CHAR(reset_date,'DD')as day,TO_CHAR(reset_date,'HH24')as hour,TO_CHAR(reset_date,'mi')as min from hr_mgt;

将此处的输出视为日期12,小时18,分钟00。

让我们说,每个月的第5天,duty_counter_column只应重置为零一次。

    Calendar reqDate = Calendar.getInstance();
    reqDate.set(Calendar.DAY_OF_MONTH, Integer.valueOf(4));
    reqDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(23));
    reqDate.set(Calendar.MINUTE, Integer.valueOf(59));
    Calendar currDate = Calendar.getInstance();
    currDate.set(Calendar.DAY_OF_MONTH, Integer.valueOf(12));
    currDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(18));
    currDate.set(Calendar.MINUTE, Integer.valueOf(00));
    System.out.println("reqDate :  " + reqDate.toString());
    System.out.println("currDate :  " + currDate.toString());
    if (currDate.equals(reqDate) || currDate.after(reqDate)) {
        System.out.println("Reached the Req Date , reset the counter");
    }

但是目前每当调度程序在每月5日之后运行时,它就会重置职责计数器。如何使这段代码每月5日只运行一次?

感谢您的建议和时间。

1 个答案:

答案 0 :(得分:2)

java.time

您使用的Calendar课程已过时。 JSR 310,现代Java日期和时间API(也称为java.time)通常可以更好地使用。

/** On what day of each month should the count be reset? 1..28 */
private static final int DAY_OF_MONTH_TO_RESET_COUNT = 5;
/** In what time zone should above day-of-month be interpreted? */
private static final ZoneId timeZone = ZoneId.of("Asia/Pontianak");

public static void resetIfDue() {
    // substitute reset_date from DB here
    LocalDate lastResetDate = LocalDate.of(2017, Month.DECEMBER, 5);

    LocalDate nextResetDate = lastResetDate.plusMonths(1)
                                .withDayOfMonth(DAY_OF_MONTH_TO_RESET_COUNT);
    LocalDate today = LocalDate.now(timeZone);
    // "not after today" means today or before today
    if (! nextResetDate.isAfter(today)) {
        System.out.println("Reset the count and update the reset_date in the database");
    }
}

你是否同意这段代码不仅更短,而且比你的更优雅,更清晰?

在Java 1.7上,获取ThreeTen Backport并从org.threeten.bp包导入类,上面的代码将起作用。从数据库中获取重置日期java.sql.Date;例如,ResultSet.getDate()会给你。然后立即使用DateTimeUtils.toLocalDate(sqlDateFromDatabase)将其转换为LocalDate以获取上述代码。使用Java 8,您可以直接从结果集中获取LocalDate

您需要决定是否将重置日期更新为计算的下一个重置日期,今天的日期或其他内容。我把它留给你。

我建议您为时区敏感操作提供明确的时区,例如获取今天的日期。所以如果不是亚洲/坤甸,请填写您的时区。要使用JVM的时区设置,请使用ZoneId.systemDefault()。请注意,您的程序的其他部分或在同一JVM中运行的其他程序可能会更改该设置,因此如果有一天您遇到更新发生得太早或太晚,这可能是错误的来源。

链接