永洪社区

标题: 8种SQL函数宝典! [打印本页]

作者: puffs    时间: 2024-6-26 14:12
标题: 8种SQL函数宝典!
01
今天小编为大家带来分类清晰的SQL函数,想不起来用什么函数记得查看这份函数大全宝典,记得收藏!SQL函数可以划分成8个类别,接下来将一一为大家介绍。

02 聚合函数
AVG(col) 返回指定列中所有的平均值。仅用于数字列并自动忽略NULL值。

COUNT(col) 返回指定列中非NULL值的数量。可用于数字和字符列。

COUNT(*) 返回表中的行数(包括有NULL值的列)。

MAX(col) 返回指定列中的最大值,忽略NULL值。可用于数字、字符和日期时间列。

MIN(col) 返回指定列中的最小值,忽略NULL值。可用于数字、字符和日期时间列。

SUM(col) 返回指定列中所有的总和,忽略NULL值。仅用于数字列。

03 数字函数
ACOS(float_expr) 返回角(以弧度表示),它的余弦值近似于指定的浮点表达式。

ASIN(float_expr) 返回角(以弧度表示),它的正弦值近似于指定的浮点表达式。

ATAN(float_expr) 返回角(以弧度表示),它的正切值近似于指定的浮点表达式。

ATN2(float_expr1, float_expr2) 返回角(以弧度表示),它的正切值在两个近似的浮点表达式之间。

COS(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的余弦三角函数的值。

COT(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的余切三角函数的值。

SIN(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的正弦三角函数的值。

TAN(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的正切三角函数的值。

ABS(num_expr) 返回数值表达式的绝对值。

CEILING(num_expr) 返回大于或等于数值表达式的最小整数。

FLOOR(num_expr) 返回小于或等于数值表达式的最大整数。

DEGREES(num_expr)返回数值表达式表示的弧度值对应的度值。

RADIANS(num_expr) 返回数值表达式表示的度值对应的弧度值。

EXP(float_expr) 根据指定的近似浮点表达式,返回指数值。

LOG(float_expr) 根据指定的近似浮点表达式,返回自然对数值。

LOG10(float_expr) 根据指定的近似浮点表达式,返回以10为底的对数。

POWER(num_expr,y) 返回幂为y的数值表达式的值。

SQRT(float_expr) 返回指定的近似浮点表达式的平方根。

SQUARE(float_expr) 返回浮点表达式的平方值。

PI() 返回常量值3.141592653589793。

RAND([seed]) 随机返回的0到1之间的近似浮点值,可以对seed指定为整数表达式(可选)。

ROUND(num_expr,length) 对数值表达式截取指定的长度,返回四舍五入后的值。

SIGN(num_expr) 对正数执行+1操作,对负数和零执行-1操作。

04 字符串函数
主要用于char和varchar数据类型。

Expr1+expr2 返回两个表达式的组合形式的字符串。

CONCAT(char_expr1, char_expr2, char_exprn) 返回连接的字符串。

ASCII(char_expr) char_expr可以是文字字符,字符串表达式或列。如果char_expr有多个字符,则该函数返回其最左侧字符的ASCII代码值。

CHAR(int_expr) 返回到之间的整数表达式的ASCⅡ字符值。如果输入的值不在有效范围内,则返回NULL。

CHARINDEX('pattern',char_expr) 返回字符表达式中指定模式的起始位置。

PATINDEX('%pattern%',expr) 返回表达式中模式第一次出现的起始位置。返回表示不存在模式形式。

FIELD(char_expr, char_expr1, char_expr2, char_expr3,...) 在char_expr之后的字符串中寻找char_expr,并返回出现的索引位置。

DIFFERENCE(char_expr1,char_expr2) 根据比较两个字符表达式的相似度,返回到之间的值。表示匹配度最佳。

SOUNDEX(char_expr) 评估两个字符串的相似度后得到的位代码。

LEN(char_expr) 返回字符表达式的长度。

LOWER(char_expr) 将字符表达式全部转换为小写。

UPPER(char_expr) 将字符表达式全部转换为大写。

LTRIM(char_expr) 返回删除掉前面空格的字符表达式。

RTRIM(char_expr) 返回删除掉其后空格的字符表达式。

TRIM(char_expr ) 返回删除掉开头和结尾空格的字符表达式。

SPACE(int_expr) 返回包含指定空格数的字符串。

REPLICATE(input_string,count) 返回重复指定次数的字符表达式产生的字符串。

RIGHT(char_expr,int_expr) 返回从字符表达式最右端起根据指定的字符个数得到的字符。

STUFF(char_expr1,start,length,char_expr2) 使用字符表达式替换字符表达式的一部分字符,从指定的位置开始替换指定的长度。

SUBSTRING(char_expr,start,length) 返回从字符表达式的指定位置开始,截取指定长度得到的字符集。

STR(float_expr[,length[,decimal]]) 返回浮点表达式的字符串表示法。

OCT(char_expr) 返回八进制参数的字符串表示。

REVERSE(char_expr) 反转字符表达式。

05 日期函数
1、获取时间
GETDATE() 当前的系统日期。

select GETDATE() -- 2019-05-07 18:34:27.343

#获取当前日期还可使用CURRENT_TIMESTAMP()、LOCALTIME()、LOCALTIMESTAMP()。

DATENAME(日期部分,date) 返回日期中日期部分的字符串形式。

select DATENAME(dw,GETDATE()) -- 星期二

注:DATENAME 和 DATEPART 的区别,返回的值类型不同,一个是VARCHAR一个是INT,另外就是星期会用本地语言来表示

DATEPART(日期部分,date) 返回日期中指定的日期部分的整数形式。

select DATEPART(dw,GETDATE()) -- (返回今天是一周中的第几天):3

YEAR(date) 返回指定日期的年份数值

select YEAR(GETDATE()) -- 2019

MONTH(date)返回指定日期的月份数值

DAY(date)返回指定日期的天数值

还可使用EXTRACT()抽取日期。

# 对于时间2021-04-02 09:25:29,分别获取其年、月、日、时、分、秒

SELECT EXTRACT(YEAR FROM NOW()); # 2021

SELECT EXTRACT(MONTH FROM NOW()); # 4

SELECT EXTRACT(DAY FROM NOW()); # 2

SELECT EXTRACT(HOUR FROM NOW()); # 9

SELECT EXTRACT(MINUTE FROM NOW()); # 25

SELECT EXTRACT(SECOND FROM NOW()); # 29

# 或者从日期格式字符串中获取

SELECT EXTRACT(SECOND FROM '2021-04-02 10:37:14.123456'); # 14

2、增加、减少函数
# 时间减少1小时(前一小时)

select date_sub(now(), INTERVAL 1 hour);

# 日期增加1天

select date_add(now(), INTERVAL 1 day);

# 其他间隔

YEAR、MONTH、DAY、HOUR、MINUTE、SECOND

以下较全的MySQL日期函数加示例可做参考(原文链接:https://blog.csdn.net/qinshijangshan/article/details/72874667

-- MySQL日期时间处理函数

-- 当前日期:2017-05-12(突然发现今天512,是不是会拉防空警报)

SELECT NOW() FROM DUAL;-- 当前日期时间:2017-05-12 11:41:47

-- 在MySQL里也存在和Oracle里类似的dual虚拟表:官方声明纯粹是为了满足select ... from...这一习惯问题,mysql会忽略对该表的引用。

-- 那么MySQL中就不用DUAL了吧。

SELECT NOW();-- 当前日期时间:2017-05-12 11:41:55

-- 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:

SELECT CURRENT_TIMESTAMP();-- 2017-05-15 10:19:31

SELECT CURRENT_TIMESTAMP;-- 2017-05-15 10:19:51

SELECT LOCALTIME();-- 2017-05-15 10:20:00

SELECT LOCALTIME;-- 2017-05-15 10:20:10

SELECT LOCALTIMESTAMP();-- 2017-05-15 10:20:21(v4.0.6)

SELECT LOCALTIMESTAMP;-- 2017-05-15 10:20:30(v4.0.6)

-- 这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now()来替代上面列出的函数。

SELECT SYSDATE();-- 当前日期时间:2017-05-12 11:42:03

-- sysdate() 日期时间函数跟 now() 类似,

-- 不同之处在于:now() 在执行开始时值就得到了;sysdate() 在函数执行时动态得到值。

-- 看下面的例子就明白了:

SELECT NOW(), SLEEP(3), NOW();

SELECT SYSDATE(), SLEEP(3), SYSDATE();

SELECT CURDATE();-- 当前日期:2017-05-12

SELECT CURRENT_DATE();-- 当前日期:等同于 CURDATE()

SELECT CURRENT_DATE;-- 当前日期:等同于 CURDATE()

SELECT CURTIME();-- 当前时间:11:42:47

SELECT CURRENT_TIME();-- 当前时间:等同于 CURTIME()

SELECT CURRENT_TIME;-- 当前时间:等同于 CURTIME()

-- 获得当前 UTC 日期时间函数

SELECT UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME()

-- MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP();-- 2017-05-15 10:32:21 | 2017-05-15 10:32:21

-- MySQL 日期时间 Extract(选取) 函数

SET @dt = '2017-05-15 10:37:14.123456';

SELECT DATE(@dt);-- 获取日期:2017-05-15

SELECT TIME('2017-05-15 10:37:14.123456');-- 获取时间:10:37:14.123456

SELECT YEAR('2017-05-15 10:37:14.123456');-- 获取年份

SELECT MONTH('2017-05-15 10:37:14.123456');-- 获取月份

SELECT DAY('2017-05-15 10:37:14.123456');-- 获取日

SELECT HOUR('2017-05-15 10:37:14.123456');-- 获取时

SELECT MINUTE('2017-05-15 10:37:14.123456');-- 获取分

SELECT SECOND('2017-05-15 10:37:14.123456');-- 获取秒

SELECT MICROSECOND('2017-05-15 10:37:14.123456');-- 获取毫秒

SELECT QUARTER('2017-05-15 10:37:14.123456');-- 获取季度

SELECT WEEK('2017-05-15 10:37:14.123456');-- 20 (获取周)

SELECT WEEK('2017-05-15 10:37:14.123456', 7);-- ****** 测试此函数在MySQL5.6下无效

SELECT WEEKOFYEAR('2017-05-15 10:37:14.123456');-- 同week()

SELECT DAYOFYEAR('2017-05-15 10:37:14.123456');-- 135 (日期在年度中第几天)

SELECT DAYOFMONTH('2017-05-15 10:37:14.123456');-- 5 (日期在月度中第几天)

SELECT DAYOFWEEK('2017-05-15 10:37:14.123456');-- 2 (日期在周中第几天;周日为第一天)

SELECT WEEKDAY('2017-05-15 10:37:14.123456');-- 0

SELECT WEEKDAY('2017-05-21 10:37:14.123456');-- 6(与dayofweek()都表示日期在周的第几天,只是参考标准不同,weekday()周一为第0天,周日为第6天)

SELECT YEARWEEK('2017-05-15 10:37:14.123456');-- 201720(年和周)

SELECT EXTRACT(YEAR FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(MONTH FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(DAY FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(HOUR FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(MINUTE FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(SECOND FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(MICROSECOND FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(QUARTER FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(WEEK FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(YEAR_MONTH FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(DAY_HOUR FROM '2017-05-15 10:37:14.123456');

SELECT EXTRACT(DAY_MINUTE FROM '2017-05-15 10:37:14.123456');-- 151037(日时分)

SELECT EXTRACT(DAY_SECOND FROM '2017-05-15 10:37:14.123456');-- 15103714(日时分秒)

SELECT EXTRACT(DAY_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 15103714123456(日时分秒毫秒)

SELECT EXTRACT(HOUR_MINUTE FROM '2017-05-15 10:37:14.123456');-- 1037(时分)

SELECT EXTRACT(HOUR_SECOND FROM '2017-05-15 10:37:14.123456');-- 103714(时分秒)

SELECT EXTRACT(HOUR_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 103714123456(日时分秒毫秒)

SELECT EXTRACT(MINUTE_SECOND FROM '2017-05-15 10:37:14.123456');-- 3714(分秒)

SELECT EXTRACT(MINUTE_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 3714123456(分秒毫秒)

SELECT EXTRACT(SECOND_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 14123456(秒毫秒)

-- MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。

-- 并且还具有选取‘day_microsecond' 等功能。

-- 注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。

SELECT DAYNAME('2017-05-15 10:37:14.123456');-- Monday(返回英文星期)

SELECT MONTHNAME('2017-05-15 10:37:14.123456');-- May(返回英文月份)

SELECT LAST_DAY('2016-02-01');-- 2016-02-29 (返回月份中最后一天)

SELECT LAST_DAY('2016-05-01');-- 2016-05-31

-- DATE_ADD(date,INTERVAL expr type) 从日期加上指定的时间间隔

-- type参数可参考:http://www.w3school.com.cn/sql/func_date_sub.asp

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 YEAR);-- 表示:2018-05-15 10:37:14.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 QUARTER);-- 表示:2017-08-15 10:37:14.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MONTH);-- 表示:2017-06-15 10:37:14.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 WEEK);-- 表示:2017-05-22 10:37:14.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 DAY);-- 表示:2017-05-16 10:37:14.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 HOUR);-- 表示:2017-05-15 11:37:14.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MINUTE);-- 表示:2017-05-15 10:38:14.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 SECOND);-- 表示:2017-05-15 10:37:15.123456

SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MICROSECOND);-- 表示:2017-05-15 10:37:14.123457

-- DATE_SUB(date,INTERVAL expr type) 从日期减去指定的时间间隔

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 YEAR);-- 表示:2016-05-15 10:37:14.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 QUARTER);-- 表示:2017-02-15 10:37:14.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 MONTH);-- 表示:2017-04-15 10:37:14.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 WEEK);-- 表示:2017-05-08 10:37:14.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 DAY);-- 表示:2017-05-14 10:37:14.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 HOUR);-- 表示:2017-05-15 09:37:14.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 MINUTE);-- 表示:2017-05-15 10:36:14.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 SECOND);-- 表示:2017-05-15 10:37:13.123456

SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 MICROSECOND);-- 表示:2017-05-15 10:37:14.123455

-- 经特殊日期测试,DATE_SUB(date,INTERVAL expr type)可放心使用

SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY);-- 前一天:2017-05-11

SELECT DATE_SUB(CURDATE(),INTERVAL -1 DAY);-- 后一天:2017-05-13

SELECT DATE_SUB(CURDATE(),INTERVAL 1 MONTH);-- 一个月前日期:2017-04-12

SELECT DATE_SUB(CURDATE(),INTERVAL -1 MONTH);-- 一个月后日期:2017-06-12

SELECT DATE_SUB(CURDATE(),INTERVAL 1 YEAR);-- 一年前日期:2016-05-12

SELECT DATE_SUB(CURDATE(),INTERVAL -1 YEAR);-- 一年后日期:20178-06-12

-- MySQL date_sub() 日期时间函数 和 date_add() 用法一致,并且可以用INTERNAL -1 xxx的形式互换使用;

-- 另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。

-- MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)

-- 函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。

-- MySQL period_add(P,N):日期加/减去N月。

SELECT PERIOD_ADD(201705,2), PERIOD_ADD(201705,-2);-- 201707 20170503

-- period_diff(P1,P2):日期 P1-P2,返回 N 个月。

SELECT PERIOD_DIFF(201706, 201703);--

-- datediff(date1,date2):两个日期相减 date1 - date2,返回天数

SELECT DATEDIFF('2017-06-05','2017-05-29');-- 7

-- TIMEDIFF(time1,time2):两个日期相减 time1 - time2,返回 TIME 差值

SELECT TIMEDIFF('2017-06-05 19:28:37', '2017-06-05 17:00:00');-- 02:28:37

-- MySQL日期转换函数

SELECT TIME_TO_SEC('01:00:05'); -- 3605

SELECT SEC_TO_TIME(3605);-- 01:00:05

-- MySQL (日期、天数)转换函数:to_days(date), from_days(days)

SELECT TO_DAYS('0000-00-00'); -- NULL

SELECT TO_DAYS('2017-06-05'); -- 736850

SELECT FROM_DAYS(0); -- '0000-00-00'

SELECT FROM_DAYS(736850); -- '2017-06-05'

-- MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

SELECT STR_TO_DATE('06.05.2017 19:40:30', '%m.%d.%Y %H:%i:%s');-- 2017-06-05 19:40:30

SELECT STR_TO_DATE('06/05/2017', '%m/%d/%Y'); -- 2017-06-05

SELECT STR_TO_DATE('2017/12/3','%Y/%m/%d') -- 2017-12-03

SELECT STR_TO_DATE('20:09:30', '%h:%i:%s') -- NULL(超过12时的小时用小写h,得到的结果为NULL)

-- 日期时间格式化

SELECT DATE_FORMAT('2017-05-12 17:03:51', '%Y年%m月%d日 %H时%i分%s秒');-- 2017年05月12日 17时03分51秒(具体需要什么格式的数据根据实际情况来;小写h为12小时制;)

SELECT TIME_FORMAT('2017-05-12 17:03:51', '%Y年%m月%d日 %H时%i分%s秒');-- 0000年00月00日 17时03分51秒(time_format()只能用于时间的格式化)

-- STR_TO_DATE()和DATE_FORMATE()为互逆操作

-- MySQL 获得国家地区时间格式函数:get_format()

-- MySQL get_format() 语法:get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

-- MySQL get_format() 用法的全部示例:

SELECT GET_FORMAT(DATE,'usa'); -- '%m.%d.%Y'

SELECT GET_FORMAT(DATE,'jis'); -- '%Y-%m-%d'

SELECT GET_FORMAT(DATE,'iso'); -- '%Y-%m-%d'

SELECT GET_FORMAT(DATE,'eur'); -- '%d.%m.%Y'

SELECT GET_FORMAT(DATE,'internal'); -- '%Y%m%d'

SELECT GET_FORMAT(DATETIME,'usa'); -- '%Y-%m-%d %H.%i.%s'

SELECT GET_FORMAT(DATETIME,'jis'); -- '%Y-%m-%d %H:%i:%s'

SELECT GET_FORMAT(DATETIME,'iso'); -- '%Y-%m-%d %H:%i:%s'

SELECT GET_FORMAT(DATETIME,'eur'); -- '%Y-%m-%d %H.%i.%s'

SELECT GET_FORMAT(DATETIME,'internal'); -- '%Y%m%d%H%i%s'

SELECT GET_FORMAT(TIME,'usa'); -- '%h:%i:%s %p'

SELECT GET_FORMAT(TIME,'jis'); -- '%H:%i:%s'

SELECT GET_FORMAT(TIME,'iso'); -- '%H:%i:%s'

SELECT GET_FORMAT(TIME,'eur'); -- '%H.%i.%s'

SELECT GET_FORMAT(TIME,'internal'); -- '%H%i%s'

-- MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

SELECT MAKEDATE(2017,31); -- '2017-01-31'

SELECT MAKEDATE(2017,32); -- '2017-02-01'

SELECT MAKETIME(19,52,35); -- '19:52:35'

-- MySQL 时区(timezone)转换函数:convert_tz(dt,from_tz,to_tz)

SELECT CONVERT_TZ('2017-06-05 19:54:12', '+08:00', '+00:00'); -- 2017-06-05 11:54:12

-- MySQL (Unix 时间戳、日期)转换函数

-- unix_timestamp(), unix_timestamp(date), from_unixtime(unix_timestamp), from_unixtime(unix_timestamp,format)

-- 将具体时间时间转为timestamp

SELECT UNIX_TIMESTAMP();-- 当前时间的时间戳:1494815779

SELECT UNIX_TIMESTAMP('2017-05-15');-- 指定日期的时间戳:1494777600

SELECT UNIX_TIMESTAMP('2017-05-15 10:37:14');-- 指定日期时间的时间戳:1494815834

-- 将时间戳转为具体时间

SELECT FROM_UNIXTIME(1494815834);-- 2017-05-15 10:37:14

SELECT FROM_UNIXTIME(1494815834, '%Y年%m月%d日 %h时%分:%s秒');-- 获取时间戳对应的格式化日期时间

-- MySQL 时间戳(timestamp)转换、增、减函数

SELECT TIMESTAMP('2017-05-15');-- 2017-05-15 00:00:00

SELECT TIMESTAMP('2017-05-15 08:12:25', '01:01:01');-- 2017-05-15 09:13:26

SELECT DATE_ADD('2017-05-15 08:12:25', INTERVAL 1 DAY);-- 2017-05-16 08:12:25

SELECT TIMESTAMPADD(DAY, 1, '2017-05-15 08:12:25');-- 2017-05-16 08:12:25; MySQL timestampadd() 函数类似于 date_add()。

SELECT TIMESTAMPDIFF(YEAR, '2017-06-01', '2016-05-15');-- -1

SELECT TIMESTAMPDIFF(MONTH, '2017-06-01', '2016-06-15');-- -11

SELECT TIMESTAMPDIFF(DAY, '2017-06-01', '2016-06-15');-- -351

SELECT TIMESTAMPDIFF(HOUR, '2017-06-01 08:12:25', '2016-06-15 00:00:00');-- -8432

SELECT TIMESTAMPDIFF(MINUTE, '2017-06-01 08:12:25', '2016-06-15 00:00:00');-- -505932

SELECT TIMESTAMPDIFF(SECOND, '2017-06-01 08:12:25', '2016-06-15 00:00:00');-- -30355945

SQL中日期的表示方法及有效范围,如下:


日期部分           缩写             值                 日期部分        缩写          值
年                      yy        1753-9999               周               wk         1-53
季度                  qq              1-4                   小时              hh         0-23
月                     mm            1-12                 分钟               mi         0-59
一年中的天        dy              1-366                秒                 ss          0-59
一月中的天        dd              1-31                毫秒               ms         0-999
一周中的天        dw              1-7        


06 转换函数

1、下列两个函数用于将(任何类型的)值转换为指定的数据类型
CONVERT(data_type[(length)], expression [, style])

expression - 要转换的表达式。

datatype - 要将表达式转换为的数据类型。

format - 可选-指定日期和时间格式的整数代码,用于在日期/时间/时间戳数据类型和字符数据类型之间进行转换。

CAST(expression AS datatype(length))

expression - 要转换的表达式。

datatype - 要将表达式转换为的数据类型。

length - 可选。结果数据类型的长度(对于 char、varchar、nchar、nvarchar、binary 和 varbinary)

CAST 和 CONVERT 提供相似的功能,但语法不同。在时间转化中一般用convert,因为它比cast多了一个style,可以根据需要转化成不同的时间格式。

2、日期相关的转换函数

# 转换日期格式:

DATE_FORMAT(date, format)

select DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s');

select DATE_FORMAT(now(),'%Y-%m-%d %H:00:00');

#字符串转日期格式

str_to_date(date, format)

select str_to_date('2021-04-02 10:37:14', '%Y-%m-%d %H:%i:%s'); # 2021-04-02 10:37:14

3、其他

FORMAT(column_name,format) 用于对字段的显示进行格式化。

INET_ATON(ip) 返回IP地址的数字表示。

INET_NTOA(num) 返回数字所代表的IP地址。

07 系统函数

用于返回元数据或相关配置设置。

COALESCE(expr1,expr2, xprN) 返回第一个非NULL表达式。

COL_LENGTH('table_name','column_name') 返回列的长度。

COL_NAME(table_id,column_id) 返回指定的表中的列名。

DATALENGTH('expr') 返回任何数据类型的实际长度。

DB_ID([‘database_name']) 返回数据库的标识号。

DB_NAME([database_id]) 返回数据库的名称。

GETANSINULL([‘database_name']) 返回数据库的默认空性(Nullability)。

HOST_ID() 返回工作站的标识号。

HOST_NAME() 返回工作站的名称。

IDENT_INCR('table_or_view') 有新的记录添加入到表中时计数加。

IDENT_SEED('table_or_view') 返回标识列的起始编号。

INDEX_COL('table_name',index_id,key_id) 返回索引的列名。

ISNULL(expr,value) 使用指定的值替换的NULL表达式。

NULLIF(expr1,expr2) Expr1与Expr2相等时,返回Null。

OBJECT_ID('obj_name') 返回数据库对象标识号。

OBJECT_NAME('object_id') 返回数据库对象名。

STATS_DATE(table_id,index_id) 返回上次更新指定索引的统计的日期。

SUSER_SID([‘login_name']) 返回用户的登录标识号。

SUSER_ID([‘login_name']) 返回用户的登录标识号。这个函数类似于SUSER_SID()函数,并且保留了向后的兼容性。

SUSER_SNAME([server_user_id]) 返回用户的登录标识号。

SUSER_NAME([server_user_id]) 返回用户的登录标识号。这个函数类似于SUSER_SNAME()函数,并且保留了向后的兼容性。

USER_ID('user_name') 返回用户的数据库标识号。

USER_NAME(['user_id']) 返回用户的数据库名称。

08 条件函数

条件函数有两类,一类是CASE(),另一类是IF()。
1、CASE()
case()函数有两种形式,分为简单型和搜索型
简单搜索:
CASE V0

WHEN V1 THEN E1

WHEN V2 THEN E2

WHEN VN THEN EN

ELSE ED

END;

复杂搜索:
CASE

WHEN condition1 THEN result1

WHEN condition2 THEN result2

WHEN conditionN THEN resultN

ELSE result

END;

简单的case表达式没有搜索型case表达式灵活,因为无法指定自己的条件,而搜索型case表达式可以包含范围条件、不等条件、使用and/or/not组合多个条件,所以,除最简单的逻辑之外,一般推荐使用搜索型case表达式。

2、IF()
IF(condition, value_if_true, value_if_false)

condition -- 要进行判断的值

value_if_true -- condition为真时返回的值

value_if_false -- condition为假时返回的值

IF()函数还衍生出了IFNULL()、NULLIF()函数。

09 加密函数

AES_ENCRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储

AES_DECRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法解密后的结果

DECODE(str,key) 使用key作为密钥解密加密字符串str

ENCRYPT(str,salt) 使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str

ENCODE(str,key) 使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储

MD5() 计算字符串str的MD5校验和

PASSWORD(str) 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。

SHA() 计算字符串str的安全散列算法(SHA)校验和





欢迎光临 永洪社区 (https://club.yonghongtech.com/) Powered by Discuz! X3.4