常用时间函数
NOW()当前时间、CURDATE()当前日期、CURTIME()当前时间
SELECT NOW(),CURDATE(),CURTIME();
>2019-03-22 10:20:13
>2019-03-22
>10:20:13
ROUND() 四舍五入
FROM_UNIXTIME() 将时间戳格式化(10位时间戳,精确到秒)
若数据库存的时间戳为13位(精确到毫秒),因MySQL只能转10位,则进行转换
SELECT FROM_UNIXTIME(ROUND(1552665572000/1000));
>2019-03-15 23:59:32
DATE_FORMAT() 格式化时间
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');
>2019-03-22 09:58:50
DATE_SUB() 日期减去指定的时间间隔 (DATE_ADD()同理)
DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名) 近7天
type常用参数:DAY、MONTH、YEAR、HOUR
常用判空函数
IFNULL(fieldA,fieldB)
当字段fieldA是NULL时取fieldB,不是NULL时取fieldA的值
COALESCE (exp,value1,value2……,valuen)
exp为待检测的表达式,返回包括exp在内的所有参数中的第一个非空表达式
SELECT IFNULL(b.count,0),COALESCE(c.sum,0) FROM ...
常用与于统计总数时对null值赋0的作用
MySQL常见JOIN语法
SELECT ... FROM table1 xxx JOIN table2 ON ...
INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录。
LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。
RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。
注:MySQL不支持FULL JOIN,不过可以通过UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL JOIN
UNION
SELECT ... FROM ... UNION SELECT ... FROM ...
对结果集取并集操作,不包括重复行,同时进行默认规则的排序
去重且排序
UNION ALL
SELECT FROM ... UNION ALL SELECT ... FROM ...
对结果集取并集操作,包括重复行,不进行排序
不去重不排序
折线图统计一段时间没有数据补0的情况
构建一个虚拟的最近日期记录,如:
统计最近三天
SELECT CURDATE() AS time
UNION ALL
SELECT DATE_SUB(CURDATE(), interval 1 DAY) AS time
UNION ALL
SELECT DATE_SUB(CURDATE(), interval 2 DAY) AS time
统计最近三月
SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS time
UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), interval 1 MONTH), '%Y-%m') AS time
UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), interval 2 MONTH), '%Y-%m') AS time
统计最近三小时
SELECT DATE_FORMAT(NOW(), '%m-%d %H') as time
UNION ALL
SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 HOUR), '%m-%d %H') AS time
UNION ALL
SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 HOUR), '%m-%d %H') AS time
或利用mysql自带数据库生成数据,如生成最近7天日期列表
SELECT @s :=@s + 1 as `index`, DATE(DATE_SUB(CURRENT_DATE, INTERVAL @s DAY)) AS `date`
FROM mysql.help_topic,(SELECT @s := -1) temp
WHERE @s < 6
ORDER BY `date` DESC
最后将以上数据与业务数据取左连接LEFT JOIN即可。