字符串函数
函数 | 功能 |
CANCAT(S1,S2,…Sn) | 连接 S1,S2,…Sn 为一个字符串 |
INSERT(str,x,y,instr) | 将字符串 str 从第 x 位置开始,y 个字符长的子串替换为字符串 instr |
LOWER(str) | 将字符串 str 中所有字符变为小写 |
UPPER(str) | 将字符串 str 中所有字符变为大写 |
LEFT(str ,x) | 返回字符串 str 最左边的 x 个字符 |
RIGHT(str,x) | 返回字符串 str 最右边的 x 个字符 |
LPAD(str,n ,pad) | 用字符串 pad 对 str 最左边进行填充,直到长度为 n 个字符长度 |
RPAD(str,n,pad) | 用字符串 pad 对 str 最右边进行填充,直到长度为 n 个字符长度 |
LTRIM(str) | 去掉字符串 str 左侧的空格 |
RTRIM(str) | 去掉字符串 str 行尾的空格 |
REPEAT(str,x) | 返回 str 重复 x 次的结果 |
REPLACE(str,a,b) | 用字符串 b 替换字符串 str 中所有出现的字符串 a |
STRCMP(s1,s2) | 比较字符串 s1 和 s2 |
TRIM(str) | 去掉字符串行尾和行头的空格 |
SUBSTRING(str,x,y) | 返回从字符串 str x 位置起 y 个字符长度的字串 |
5.2 数值函数
MySQL 中另外一类很重要的函数就是数值函数,这些函数能处理很多数值方面的运算。可以想象,如果没有这些函数的支持,用户在编写有关数值运算方面的代码时将会困难重重,举个例子,如果没有 ABS 函数的话,如果要取一个数值的绝对值,就需要进行好多次判断才能返回这个值,而数字函数能够大大提高用户的工作效率。表 5-2 中列出了在 MySQL 中会经常使用的数值函数。
表 5-2 MySQL 中的常用数值函数
函数 | 功能 |
ABS(x) | 返回 x 的绝对值 |
CEIL(x) | 返回大于x的最大整数值 |
FLOOR(x) | 返回小于 x 的最大整数值 |
MOD(x,y) | 返回 x/y 的模 |
RAND() | 返回 0 到 1 内的随机值 |
ROUND(x,y) | 返回参数 x 的四舍五入的有 y 位小数的值 |
TRUNCATE(x,y) | 返回数字 x 截断为 y 位小数的结果 |
5.3 日期和时间函数
有时我们可能会遇到这样的需求:当前时间是多少、下个月的今天是星期几、统计截止到当前日期前 3 天的收入总和等。这些需求就需要日期和时间函数来实现,表 5-3 列出了 MySQL 中支持的一些常用日期和时间函数。
表 5-3 MySQL 中的常用日期时间函数
函数 | 功能 |
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前的日期和时间 |
UNIX_TIMESTAMP(date) | 返回日期 date 的 UNIX 时间戳 |
FROM_UNIXTIME | 返回 UNIX 时间戳的日期值 |
WEEK(date) | 返回日期 date 为一年中的第几周 |
YEAR(date) | 返回日期 date 的年份 |
HOUR(time) | 返回 time 的小时值 |
MINUTE(time) | 返回 time 的分钟值 |
MONTHNAME(date) | 返回 date 的月份名 |
DATE_FORMAT(date,fmt) | 返回按字符串 fmt 格式化日期 date 值 |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期或时间值加上一个时间间隔的时间值 |
DATEDIFF(expr,expr2) | 返回起始时间 expr 和结束时间 expr2 之间的天数 |
下面结合一些实例来逐个讲解每个函数的使用方法。
- CURDATE()函数:返回当前日期,只包含年月日。
mysql> select CURDATE();
+------------+
| CURDATE() |
+------------+
| 2007-07-11 |
+------------+
1 row in set (0.03 sec)
- DATE_FORMAT(date,fmt)函数:按字符串 fmt 格式化日期 date 值,此函数能够按指定的格式显示日期,可以用到的格式符如表 5-4 所示。表 5-4 MySQL 中的日期时间格式
格式符 | 格式说明 |
%S,%s | 两位数字形式的秒(00,01,...,59) |
%i | 两位数字形式的分(00,01,...,59) |
%H | 两位数字形式的小时,24 小时(00,01,...,23) |
%h,%I | 两位数字形式的小时,12 小时(01,02,...,12) |
%k | 数字形式的小时,24 小时(0,1,...,23) |
%l | 数字形式的小时,12 小时(1,2,...,12) |
%T | 24 小时的时间形式(hh:mm:ss) |
%r | 12 小时的时间形式(hh:mm:ssAM 或 hh:mm:ssPM) |
%p | AM 或 PM |
%W | 一周中每一天的名称(Sunday,Monday,...,Saturday) |
%a | 一周中每一天名称的缩写(Sun,Mon,...,Sat) |
%d | 两位数字表示月中的天数(00,01,...,31) |
%e | 数字形式表示月中的天数(1,2,...,31) |
%D | 英文后缀表示月中的天数(1st,2nd,3rd,...) |
%w | 以数字形式表示周中的天数(0=Sunday,1=Monday,...,6=Saturday) |
%j | 以3位数字表示年中的天数(001,002,...,366) |
%U | 周(0,1,52),其中 Sunday 为周中的第一天 |
%u | 周(0,1,52),其中 Monday 为周中的第一天 |
%M | 月名(January,February,...,December) |
%b | 缩写的月名(January,February,...,December) |
%m | 两位数字表示的月份(01,02,...,12) |
%c | 数字表示的月份(1,2,...,12) |
%Y | 4位数字表示的年份 |
%y | 两位数字表示的年份 |
%% | 直接值“%” |
下面的例子将当前时间显示为“月,日,年”格式:
mysql> select DATE_FORMAT(now(),'%M,%D,%Y');
+-------------------------------+
| DATE_FORMAT(now(),'%M,%D,%Y') |
+-------------------------------+
| July,11th,2007 |
+-------------------------------+
1 row in set (0.00 sec)
- DATE_ADD(date,INTERVAL expr type)函数:返回与所给日期 date 相差 INTERVAL 时间段的日期。
其中 INTERVAL 是间隔类型关键字,expr 是一个表达式,这个表达式对应后面的类型,type 是间隔类型,MySQL 提供了 13 种间隔类型,如表 5-5 所示。
表 5-5 MySQL 中的日期间隔类型
表达式类型 | 描述 | 格式 |
HOUR | 小时 | hh |
MINUTE | 分 | mm |
SECOND | 秒 | ss |
YEAR | 年 | YY |
MONTH | 月 | MM |
DAY | 日 | DD |
YEAR_MONTH | 年和月 | YY-MM |
DAY_HOUR | 日和小时 | DD hh |
DAY_MINUTE | 日和分钟 | DD hh:mm |
DAY_ SECOND | 日和秒 | DD hh:mm:ss |
HOUR_MINUTE | 小时和分 | hh:mm |
HOUR_SECOND | 小时和秒 | hh:ss |
MINUTE_SECOND | 分钟和秒 | mm:ss |
来看一个具体的例子,在这个例子中第 1 列返回了当前日期时间,第 2 列返回距离当前日期 31 天后的日期时间,第 3 列返回距离当前日期一年两个月后的日期时间。
mysql> select now() current,date_add(now(),INTERVAL 31 day) after31days, date_add(now(),INTERVAL '1_2' year_month) after_oneyear_twomonth;
+---------------------+---------------------+------------------------+
| current | after31days | after_oneyear_twomonth |
+---------------------+---------------------+------------------------+
| 2007-09-03 11:30:48 | 2007-10-04 11:30:48 | 2008-11-03 11:30:48 |
+---------------------+---------------------+------------------------+
1 row in set (0.01 sec)
同样也可以用负数让它返回之前的某个日期时间,如下第 1 列返回了当前日期时间,第 2 列返回距离当前日期 31 天前的日期时间,第 3 列返回距离当前日期一年两个月前的日期时间。
mysql> select now() current,date_add(now(),INTERVAL -31 day) after31days,date_a dd(now(),INTERVAL '-1_-2' year_month) after_oneyear_twomonth;
+---------------------+---------------------+------------------------+
| current | after31days | after_oneyear_twomonth |
+---------------------+---------------------+------------------------+
| 2007-09-03 11:36:35 | 2007-08-03 11:36:35 | 2006-07-03 11:36:35 |
+---------------------+---------------------+------------------------+ 1 row in set (0.00 sec)
l DATEDIFF(date1,date2)函数:用来计算两个日期之间相差的天数。下面的例子计算出当前距离 2008 年 8 月 8 日的奥运会开幕式还有多少天:
mysql> select DATEDIFF('2008-08-08',now());
+------------------------------+
| DATEDIFF('2008-08-08',now()) |
+------------------------------+
| 328 |
+------------------------------+ 1 row in set (0.01 sec)