代码之家  ›  专栏  ›  技术社区  ›  jaggs

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

  •  0
  • jaggs  · 技术社区  · 7 年前

    我有一个专栏名为

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

    我使用以下sql获取reset\u日期,并将其设置为当前日期

    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;
    

    考虑此处的输出为Date 12,Hour 18,minute 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 回复  |  直到 7 年前
        1
  •  3
  •   Basil Bourque    7 年前

    Java语言时间

    这个 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上,从 org.threeten.bp 包,上述代码将起作用。将重置日期作为 java.sql.Date 从数据库中; ResultSet.getDate() 例如,我会把它给你。然后立即使用 DateTimeUtils.toLocalDate(sqlDateFromDatabase) 将其转换为 LocalDate 对于上述代码。使用Java 8,您可以获得 本地日期 直接从结果集。

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

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

    链接