Mysql group by 实现排序,Java 8 LocalDateTime 使用,ConcurrentHashMap中的putIfAbsent方法的使用,HashMap的put方法返回值

Mysql group by 实现排序 【参考

数据库原理中一个重要的论点就是集全中的记录是没有顺序的。 不能依赖数据库自己的排序。 原表中需要有个排序的字段以能确定原始顺序,比如加个ID序列。
先分组排序

  SELECT
    max(id) max_id
    FROM xxx_table
    where
    deleted = 0 and enabled = 1  and time > DATE_SUB(CURDATE(),INTERVAL 1 DAY)
   group by cluster_id,group_id order by max_id desc

在根据排序结果 分页查询

curdate()表示当天日期 【参考
统计前一天
如果表示前一天的数据,则不能使用curdate()-1,因为当日期为月初时,curdate()-1 日期就不是上一个月的月末日期。

关于date_sub()函数的例子:
今天是2017年8月1日。
date_sub('2017-08-01',interval 1 day) 表示 2017-07-31
date_sub('2017-08-01',interval 0 day) 表示 2017-08-01
date_sub('2017-08-01',interval -1 day) 表示 2017-08-02
date_sub('2017-07-31',interval -1 day) 表示 2017-08-01
date_sub(curdate(),interval 1 day) 表示 2017-07-31
date_sub(curdate(),interval -1 day) 表示 2017-08-02
date_sub(curdate(),interval 1 month) 表示 2017-07-01
date_sub(curdate(),interval -1 month) 表示 2017-09-01
date_sub(curdate(),interval 1 year) 表示 2016-08-01

Java 8 LocalDateTime 【参考

LocalTime : 只包括时间
LocalDate : 只包括日期
LocalDateTime : 包括日期和时间

JDBC映射
LocalTime 对应 time
LocalDate 对应 date
LocalDateTime 对应 timestamp

  public class TimeTest {

@Test
public void testTime() {
    LocalDateTime time = LocalDateTime.now();

    System.out.println(time.toString()); //字符串表示
    System.out.println(time.toLocalTime()); //获取时间(LocalTime)
    System.out.println(time.toLocalDate()); //获取日期(LocalDate)
    System.out.println(time.getDayOfMonth()); //获取当前时间月份的第几天
    System.out.println(time.getDayOfWeek());  //获取当前周的第几天
    System.out.println(time.getDayOfYear());  //获取当前时间在该年属于第几天
    System.out.println(time.getHour());
    System.out.println(time.getMinute());
    System.out.println(time.getMonthValue());
    System.out.println(time.getMonth());
    System.out.println("-----------------------------------");
    //格式化输出
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY/MM/dd HH:mm:ss");
    System.out.println(time.format(formatter));
    //构造时间
    LocalDateTime startTime = LocalDateTime.of(2018, 1, 1, 20, 31, 20);
    LocalDateTime endTime = LocalDateTime.of(2018, 1, 3, 20, 31, 20);
    //比较时间
    System.out.println(time.isAfter(startTime));
    System.out.println(time.isBefore(endTime));

    //时间运算,相加相减
    System.out.println(time.plusYears(2)); //加2年
    System.out.println(time.plusDays(2)); //加两天
    System.out.println(time.minusYears(2)); //减两年
    System.out.println(time.minusDays(2)); //减两天

    //获取毫秒数(使用Instant)
    System.out.println(time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
    //获取秒数(使用Instant)
    System.out.println(time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond());
}

  }

ConcurrentHashMap中的putIfAbsent方法的使用 【参考

public V putIfAbsent(@NotNull K key,@NotNull V value)
putIfAbsent方法主要是在向ConcurrentHashMap中添加键—值对的时候,它会先判断该键值对是否已经存在。

如果不存在(新的entry),那么会向map中添加该键值对,并返回null。
如果已经存在,那么不会覆盖已有的值,直接返回已经存在的值。

HashMap的put方法返回值

如果key没有重复,put成功,则返回null
如果key重复了,返回的是map.get(key),也就是当前这个key对应的value

原文地址:https://www.cnblogs.com/cuiyf/p/13738276.html