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