时间函数
- 获取当前日期,当前时间,当前日期+时间
select CURDATE(),CURTIME(),NOW();
示例:
以上的日期函数获得效果,在其它时间函数中也能活得,此处不列举,记住最简单,最好用的就行。
比如与NOW() 效果相同的函数有localtime()等4个函数。
但我认为程序员已经卷成这样了,谁还能记得茴字有4种写法?
- 获取UTC时间
(这个不是很常用,但是我在业务里碰到过几次)
select UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME(), NOW();
示例:
– 日期 增减 相应的天数,月数,秒数等
DATE_ADD(date,INTERVAL expr type) 增加
DATE_SUB(date, INTERVAL expr type) 减去
type常用取值:SECOND,MINUTE,HOUR,DAY,WEEK,MONTH
有时候MySQL会统计当前时间往前一个月,或者一周的数据,然后做成报表。
我遇到过数据库的时间,存的是毫秒数,在DATE_SUB()函数减去时间后,还要转化为时间戳,然后再乘以1000
-- 当前时间往前一个月,转化为秒,再乘以1000,转为毫秒数
select UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 MONTH))*1000
顺手把秒数转时间的函数FROM_UNIXTIME(秒数)
提一下。
聚合函数
字符串函数
常用的字符串函数有CONCAT(str1,str2,...)
和 GROUP_CONCAT(expr)
创建测试数据:
CREATE TABLE `user` (
`user_id` int NOT NULL,
`user_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`hobby` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `user` VALUES ('1', 'Layman', '打LOL ');
INSERT INTO `user` VALUES ('1', 'Layman', '玩原神');
INSERT INTO `user` VALUES ('1', 'Layman', '摸鱼');
INSERT INTO `user` VALUES ('2', 'Alice', '学习');
INSERT INTO `user` VALUES ('2', 'Alice', '化妆');
数据如下:
CONCAT()
是 行 拼接,而 GROUP_CONCAT(expr)
是 列 拼接,通常与GROUP BY
一起使用。
CONCAT() ,以 逗号 (,
)进行分割
SQL:
select user_id,user_name,hobby,CONCAT(user_name,',',hobby)from user;
结果集:
可以看到,CONCAT()
函数针对一行的数据进行拼接。
如果,我想展示针对,在一行中展示Layman或者Alice的全部hobby,应该怎么办?
此时,可以使用 GROUP_CONCAT(expr)
函数,但是要和GROUP BY
一起使用。
GROUP_CONCAT() ,默认以 (,
)进行分割
SQL:
select user_id,user_name,GROUP_CONCAT(hobby) from user GROUP BY user_id,user_name
结果集:
推荐博客:concat,concat_ws和group_concat函数的区别
判断函数
推荐博客:MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用