MySQL全面瓦解13:系統函數相關

概述

提到MySQL的系統函數,咱們前面有使用過聚合函數,其實只是其中一小部分。MySQL提供不少功能強大、方便易用的函數,使用這些函數,能夠極大地提升用戶對於數據庫的管理效率,並更加靈活地知足不一樣用戶的需求。html

本文將MySQL的函數分類並彙總,以便提供後面使用中的參考。mysql

MySQL 數值類型函數

數值類型函數 說明
abs 返回絕對值
sqrt 返回二次方根
mod 返回餘數
ceil/ceiling 兩個函數功能一致,返回不小於參數的最小整數,即向上取整
floor 向下取整,返回值轉化爲bigint
rand 生成一個0~1之間的隨機數,傳入整數參數是,用來產生重複序列
round 對所傳參數進行四捨五入
sign 返回參數的符號(正、負)
pow/power 兩個函數的功能相同,返回所傳參數的次方的結果值
sin 求正弦值
asin 求反正弦值,與函數 SIN 互爲反函數
cos 求餘弦值
acos 求反餘弦值,與函數 COS 互爲反函數
tan 求正切值
atan 求反正切值,與函數 TAN 互爲反函數
cot 求餘切值

絕對值:abs

使用ABS(number)的目的是返回 number的絕對值,若是是正值則返回是是它自己,負值則返回相反的正值,0則返回0。sql

1 mysql> select abs(-7),abs(8),abs(0);
2 +---------+--------+--------+
3 | abs(-7) | abs(8) | abs(0) |
4 +---------+--------+--------+
5 |       7 |      8 |      0 |
6 +---------+--------+--------+
7 1 row in set

求二次方根(開方):sqrt

使用SQRT(number)函數,返回的是number的開方根。這邊須要注意,負數沒法開方,因此返回的是null,以下所示。數據庫

1 mysql> select sqrt(-7),sqrt(9),sqrt(39);
2 +----------+---------+-------------------+
3 | sqrt(-7) | sqrt(9) | sqrt(39)          |
4 +----------+---------+-------------------+
5 | NULL     |       3 | 6.244997998398398 |
6 +----------+---------+-------------------+
7 1 row in set

 

求模(求餘數):mod

MOD(number1,number2) 返回 number1 除以number2的餘數,包含小數的數值一樣有效,以下,9%4.5=0,18.3%9=0.3:服務器

1 mysql> select mod(100,7),mod(100,10),mod(9,4.5),mod(18.3,9);
2 +------------+-------------+------------+-------------+
3 | mod(100,7) | mod(100,10) | mod(9,4.5) | mod(18.3,9) |
4 +------------+-------------+------------+-------------+
5 |          2 |           0 | 0          | 0.3         |
6 +------------+-------------+------------+-------------+
7 1 row in set

向上取整:ceil/ceiling

使用CEIL(number)和CEILING(number)一個意思,返回大於等於number的最小整數值。函數

1 mysql> select ceiling(-7.9),ceil(7.5);
2 +---------------+-----------+
3 | ceiling(-7.9) | ceil(7.5) |
4 +---------------+-----------+
5 |            -7 |         8 |
6 +---------------+-----------+
7 1 row in set 

這邊須要注意,返回的類型是bigint,作存儲或計算的時候須要注意數據類型匹配。工具

向下取整:floor

與上面ceil正好相反,floor(number) 返回的是小於 number 的最大整數值。學習

1 mysql> select floor(-7.9),floor(7.5);
2 +-------------+------------+
3 | floor(-7.9) | floor(7.5) |
4 +-------------+------------+
5 |          -8 |          7 |
6 +-------------+------------+
7 1 row in set

 

隨機數:rand

生成0~1之間的隨機數。若是傳入整數參數,則會產生重複序列,再次調用仍是這個隨機數,以下圖,第三、五、7個是重複序列。測試

1 mysql> select rand(),rand(),rand(2),rand(),rand(2),rand(),rand(2);
2 +--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
3 | rand()             | rand()             | rand(2)            | rand()             | rand(2)            | rand()             | rand(2)            |
4 +--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
5 | 0.9059044131132815 | 0.9619487030077248 | 0.6555866465490187 | 0.0920303064324244 | 0.6555866465490187 | 0.5743054538725926 | 0.6555866465490187 |
6 +--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
7 1 row in set

四捨五入:round

函數round(number1,number2),指的是對給定的值number1進行四捨五入的取值過程,number2是指定保留小數後的位數,爲負數時,則是指定保留小數前的位數。編碼

1 mysql> select round(78.2),round(78.5),round(-78.78,1),round(78.7819,3),round(78.78,-1),round(78.78,-2);
2 +-------------+-------------+-----------------+------------------+-----------------+-----------------+
3 | round(78.2) | round(78.5) | round(-78.78,1) | round(78.7819,3) | round(78.78,-1) | round(78.78,-2) |
4 +-------------+-------------+-----------------+------------------+-----------------+-----------------+
5 | 78          | 79          | -78.8           | 78.782           | 80              | 100             |
6 +-------------+-------------+-----------------+------------------+-----------------+-----------------+
7 1 row in set 

round(78.78,-1)按照個位數取整,爲80;round(78.78,-2)按照百位數取整,爲100。

返回參數符號:sign

這樣須要注意,當你的值爲負數時,返回的是-1,當你的值爲正數時候,返回的是1,當爲0時,返回0。

1 mysql> select sign(-78),sign(0),sign(78);
2 +-----------+---------+----------+
3 | sign(-78) | sign(0) | sign(78) |
4 +-----------+---------+----------+
5 |        -1 |       0 |        1 |
6 +-----------+---------+----------+
7 1 row in set

n次方函數:pow/power

函數pow/power(number1,number2),用於計算 number1 的 number2 次方,number2能夠爲負數,爲負數時,在次方基礎上要再取倒數。

1 mysql> select pow(10,0),pow(10,1),pow(10,2),pow(10,3),power(10,-2);
2 +-----------+-----------+-----------+-----------+--------------+
3 | pow(10,0) | pow(10,1) | pow(10,2) | pow(10,3) | power(10,-2) |
4 +-----------+-----------+-----------+-----------+--------------+
5 |         1 |        10 |       100 |      1000 |         0.01 |
6 +-----------+-----------+-----------+-----------+--------------+
7 1 row in set 

如上,pow(10,-2) = 1 / pow(10,2)=0.01;

三角函數:sin、cos等

sin爲正弦值,cos爲餘弦值,這個咱們數學學過了,咱們也學過sin(x+y)=sin(x)*cos(y)+ cos(x)*sin(y),一塊兒驗證下,以下:

1 mysql> select sin(1),cos(1),sin(2),sin(1)*cos(1) + cos(1)*sin(1),pi();
2 +--------------------+--------------------+--------------------+-------------------------------+----------+
3 | sin(1)             | cos(1)             | sin(2)             | sin(1)*cos(1) + cos(1)*sin(1) | pi()     |
4 +--------------------+--------------------+--------------------+-------------------------------+----------+
5 | 0.8414709848078965 | 0.5403023058681398 | 0.9092974268256817 |            0.9092974268256818 | 3.141593 |
6 +--------------------+--------------------+--------------------+-------------------------------+----------+
7 1 row in set

 

其餘三角函數能夠如法炮製測試下,都是咱們學過的數學知識。

MySQL 字符類型函數

 

字符類型函數 說明
length 計算字符串長度函數,返回字符串的字節長度
concat 合併字符串函數,返回結果爲鏈接參數產生的字符串,參數可使一個或多個
insert 替換字符串函數
lower 將字符串中的字母轉換爲小寫
upper 將字符串中的字母轉換爲大寫
left 從左側字截取符串,返回字符串左邊的n個字符
right 從右側字截取符串,返回字符串右邊的n個字符
trim 刪除字符串左右兩側的空格
replace 字符串替換函數,返回替換後的新字符串
substr/substring 截取字符串,返回從指定位置開始的指定長度的字符換
reverse 字符串反轉(逆序)函數,返回與原始字符串順序相反的字符串

字符串長度:length

統計字符串的字節長度,一這邊須要注意,單個數字或者字符是一個字節,漢字(使用utf-8編碼格式)是三個字節,字符串中的空格也佔據一個字節。

1 mysql> select length('brand and helen'),length('雙十一brand折扣'),length('雙十一');
2 +---------------------------+---------------------------+------------------+
3 | length('brand and helen') | length('雙十一brand折扣') | length('雙十一') |
4 +---------------------------+---------------------------+------------------+
5 |                        15 |                        20 |                9 |
6 +---------------------------+---------------------------+------------------+
7 1 row in set

合併字符串:concat

CONCAT(str1,str1,…) 函數,參數1個或者n個,返回值會將參數合併的結果返回回來,這邊須要注意的是,若是有一個值是null的,正整個結果都是null值。

1 mysql> select concat('brand',' and ','helen'),concat('brand',null,'helen');
2 +---------------------------------+------------------------------+
3 | concat('brand',' and ','helen') | concat('brand',null,'helen') |
4 +---------------------------------+------------------------------+
5 | brand and helen                 | NULL                         |
6 +---------------------------------+------------------------------+
7 1 row in set

替換字符串:insert

INSERT(str1,index,len,str2) 指str1字符串的index位置開始的len長度的字符用str2來替換。

 1 mysql> select insert('Brand is a handsome boy!',7,2,'**');
 2 +---------------------------------------------+
 3 | insert('Brand is a handsome boy!',7,2,'**') |
 4 +---------------------------------------------+
 5 | Brand ** a handsome boy!                    |
 6 +---------------------------------------------+
 7 1 row in set
 8 
 9 mysql> select insert('Brand is a handsome boy!',100,2,'**');
10 +-----------------------------------------------+
11 | insert('Brand is a handsome boy!',100,2,'**') |
12 +-----------------------------------------------+
13 | Brand is a handsome boy!                      |
14 +-----------------------------------------------+
15 1 row in set
16 
17 mysql> select insert('Brand is a handsome boy!',7,100,'**');
18 +-----------------------------------------------+
19 | insert('Brand is a handsome boy!',7,100,'**') |
20 +-----------------------------------------------+
21 | Brand **                                      |
22 +-----------------------------------------------+
23 1 row in set
24 
25 mysql> select insert('Brand is a handsome boy!',7,100,null);
26 +-----------------------------------------------+
27 | insert('Brand is a handsome boy!',7,100,null) |
28 +-----------------------------------------------+
29 | NULL                                          |
30 +-----------------------------------------------+
31 1 row in set 

從上面的語句能夠總結如下幾點:

一、index指的並不是是索引位置而是實際位置,他是從1開始計算的,因此是字符串的索引+1,如第一個。

二、若是index超過字符串最大位置,則返回原值,如第二個。

三、若是len超過字符串長度,是容許的,而且index以後的內容都會被替換。

四、四個參數中只要有一個值爲null,系統認爲函數調用有問題,一樣返回null給你。

大小寫轉換:upper/lower

upper指的是把字符串轉換成大寫,lower指的是把字符串轉爲小寫。

1 mysql> select upper('BRand'),upper('brand'),lower('BRAND'),lower('BRand');
2 +----------------+----------------+----------------+----------------+
3 | upper('BRand') | upper('brand') | lower('BRAND') | lower('BRand') |
4 +----------------+----------------+----------------+----------------+
5 | BRAND          | BRAND          | brand          | brand          |
6 +----------------+----------------+----------------+----------------+
7 1 row in set

左右字符串截取:left、right

LEFT(str,num)、RIGHT(str,num) 函數返回字符串 str 最左邊或者最右邊的 num 個字符,num小於等於0的時候返回空。

1 mysql> select left('brand',2),left('brand',100),right('brand',2),left('brand',0),left('brand',-1);
2 +-----------------+-------------------+------------------+-----------------+------------------+
3 | left('brand',2) | left('brand',100) | right('brand',2) | left('brand',0) | left('brand',-1) |
4 +-----------------+-------------------+------------------+-----------------+------------------+
5 | br              | brand             | nd               |                 |                  |
6 +-----------------+-------------------+------------------+-----------------+------------------+
7 1 row in set 

字符串移除空格:trim、ltrim、rtrim

TRIM(str):刪除str左右空格;LTRIM(str):只刪除字符串左邊的空格;RTRIM(Str):刪除字符串右邊的空格。下面的例子簡單明瞭:

1 mysql> select concat('|',trim(' brand '),'|'),concat('|',ltrim(' brand '),'|'),concat('|',rtrim(' brand '),'|');
2 +---------------------------------+----------------------------------+----------------------------------+
3 | concat('|',trim(' brand '),'|') | concat('|',ltrim(' brand '),'|') | concat('|',rtrim(' brand '),'|') |
4 +---------------------------------+----------------------------------+----------------------------------+
5 | |brand|                         | |brand |                         | | brand|                         |
6 +---------------------------------+----------------------------------+----------------------------------+
7 1 row in set

字符串替換:replace

REPLACE(str,a1,a2) ,對於字符串 str ,出現的全部a1都使用a2來替換。

1 mysql> select replace('brand is a handsome boy!','and','***');
2 +-------------------------------------------------+
3 | replace('brand is a handsome boy!','and','***') |
4 +-------------------------------------------------+
5 | br*** is a h***some boy!                        |
6 +-------------------------------------------------+
7 1 row in set

 

字符串截斷:substr/substring

一種方式是:substr(str1,index,len),截取字符串str1從位置 index 開始的len長度的子字符串。

 1 mysql> select substr('Brand',3);
 2 +-------------------+
 3 | substr('Brand',3) |
 4 +-------------------+
 5 | and               |
 6 +-------------------+
 7 1 row in set
 8 
 9 mysql> select substr('Brand',3,2);
10 +---------------------+
11 | substr('Brand',3,2) |
12 +---------------------+
13 | an                  |
14 +---------------------+
15 1 row in set
16 
17 mysql> select substr('Brand',-2);
18 +--------------------+
19 | substr('Brand',-2) |
20 +--------------------+
21 | nd                 |
22 +--------------------+
23 1 row in set
24 
25 mysql> select substr('Brand',-4,2);
26 +----------------------+
27 | substr('Brand',-4,2) |
28 +----------------------+
29 | ra                   |
30 +----------------------+
31 1 row in set

 

從上面的4個語句能夠總結如下幾點:

一、index指的並不是是索引位置而是實際位置,他是從1開始計算的,因此是字符串的索引+1,如第一個。

二、若是是index是負數,則從右開始算,即倒數,如substr('Brand',-4,2),則從右數第四個字符,即r,而後取以後的2個字符,即ra。

另外一種方式是:substr(str from index for len),同理,是截取字符串str從位置 index 開始的len長度的子字符串。

1 mysql> SELECT substring('helenlyn' FROM 3 FOR 3),substring('helenlyn' FROM -3 FOR 3);
2 +------------------------------------+-------------------------------------+
3 | substring('helenlyn' FROM 3 FOR 3) | substring('helenlyn' FROM -3 FOR 3) |
4 +------------------------------------+-------------------------------------+
5 | len                                | lyn                                 |
6 +------------------------------------+-------------------------------------+
7 1 row in set

字符串反轉:reverse

REVERSE(str) 指的是將原字符串 str 直接反序顯示,好比abc,反序爲cba:

mysql> select REVERSE('Brand');
  
+------------------+
| REVERSE('Brand') |
+------------------+
| dnarB            |
+------------------+
1 row in set

MySQL 日期和時間類型函數

日期類型函數 說明
curdate/current_date 兩個函數做用相同,返回當前系統的日期值
curtime/current_time 兩個函數做用相同,返回當前系統的時間值
now/sysdate 兩個函數做用相同,返回當前系統的日期和時間值
unix_timestamp 獲取UNIX時間戳函數,返回一個以 UNIX 時間戳爲基礎的無符號整數
from_unixtime 將 UNIX 時間戳轉換爲時間格式,與UNIX_TIMESTAMP互爲反函數
month 獲取指定日期中的月份
monthname 獲取指定日期中的月份英文名稱
dayname 獲取指定曰期對應的星期幾的英文名稱
dayofweek 獲取指定日期是一週中是第幾天,返回值範圍是1~7,1=週日
week 獲取指定日期是一年中的第幾周,返回值的範圍是否爲 0〜52 或 1〜53
dayofyear 獲取指定曰期是一年中的第幾天,返回值範圍是1~366
dayofmonth 獲取指定日期是一個月中是第幾天,返回值範圍是1~31
year 獲取年份,返回值範圍是 1970〜2069
time_to_sec 將時間參數轉換爲秒數
sec_to_time 將秒數轉換爲時間,與TIME_TO_SEC 互爲相反
date_add/adddate 兩個函數功能相同,都是向日期添加指定的時間間隔
date_sub/subdate 兩個函數功能相同,都是向日期減去指定的時間間隔
addtime 時間加法運算,在原始時間上添加指定的時間
subtime 時間減法運算,在原始時間上減去指定的時間
datediff 獲取兩個日期之間間隔,返回參數 1 減去參數 2 的值
date_format 格式化指定的日期,根據參數返回指定格式的值
weekday 獲取指定日期在一週內的對應的工做日索引

返回系統日期:curdate/current_date

返回當前所在服務器的系統日期,當以字符串方式返回的時候,格式爲"YYYY-MM-DD",當以數值方式返回的時候,格式爲"YYYYMMDD",以下面+0後獲得 20201128:

1 mysql> select curdate(),curdate()+0,current_date(),current_date()+0;
2 +------------+-------------+----------------+------------------+
3 | curdate()  | curdate()+0 | current_date() | current_date()+0 |
4 +------------+-------------+----------------+------------------+
5 | 2020-11-28 |    20201128 | 2020-11-28     |         20201128 |
6 +------------+-------------+----------------+------------------+
7 1 row in set

返回系統時間:curtime/current_time

返回當前所在服務器的系統時間,當以字符串方式返回的時候,格式爲"HH:MM:SS",當以數值方式返回的時候,格式爲"HHMMSS",以下面+0後獲得 103002:

1 mysql> select curtime(),curtime()+0,current_time(),current_time()+0;
2 +-----------+-------------+----------------+------------------+
3 | curtime() | curtime()+0 | current_time() | current_time()+0 |
4 +-----------+-------------+----------------+------------------+
5 | 10:30:02  |      103002 | 10:30:02       |           103002 |
6 +-----------+-------------+----------------+------------------+
7 1 row in set

返回系統日期+時間:now/sysdate

同理返回系統日期+時間,格式爲"YYYY-MM-DD HH:MM:SS" 或者 "YYYYMMDDHHMMSS",根據不一樣場景返回對應格式。

1 mysql> select now(),now()+0,sysdate(),sysdate()+0;
2 +---------------------+----------------+---------------------+----------------+
3 | now()               | now()+0        | sysdate()           | sysdate()+0    |
4 +---------------------+----------------+---------------------+----------------+
5 | 2020-11-28 10:35:39 | 20201128103539 | 2020-11-28 10:35:39 | 20201128103539 |
6 +---------------------+----------------+---------------------+----------------+
7 1 row in set

返回時間戳:unix_timestamp

unix_timestamp(date),裏面的date是可選參數,無參的時候等同於得到當前系統時間的時間戳:

1 mysql> select unix_timestamp(),unix_timestamp(now()),unix_timestamp('2021-05-01 20:20:20');
2 +------------------+-----------------------+---------------------------------------+
3 | unix_timestamp() | unix_timestamp(now()) | unix_timestamp('2021-05-01 20:20:20') |
4 +------------------+-----------------------+---------------------------------------+
5 |       1606531656 |            1606531656 |                            1619871620 |
6 +------------------+-----------------------+---------------------------------------+
7 1 row in set

時間戳轉日期:from_unixtime

FROM_UNIXTIME(timestamp[,format])  與上面正好相反,把時間戳數據進行處理,並返回日期時間的格式,

參數timestamp是時間戳,參數format是格式,有%Y %m  %d %H之類分別來表明年月日時分秒等,以下

 

格式 說明
%M 月名字(January~December)
%W 星期名字(Sunday~Saturday)
%D 有英語前綴的月份的日期(1st, 2nd, 3rd, 等等)
%Y 年, 數字, 4 位
%y 年, 數字, 2 位
%a 縮寫的星期名字(Sun~Sat)
%d 月份中的天數, 數字(00~31)
%e 月份中的天數, 數字(0~31)
%m 月, 數字(01~12)
%c 月, 數字(1~12)
%b 縮寫的月份名字(Jan~Dec)
%j 一年中的天數(001~366)
%H 小時(00~23)
%k 小時(0~23)
%h 小時(01~12)
%I 小時(01~12)
%l(小寫的L) 小時(1~12)
%i 分鐘, 數字(00~59)
%r 時間,12 小時(hh:mm:ss [AP]M)
%T 時間,24 小時(hh:mm:ss)
%S 秒(00~59)
%s 秒(00~59)
%p AM或PM
%W 一個星期中的天數英文名稱(Sunday~Saturday)
%w 一個星期中的天數(0=Sunday ~6=Saturday)
%U 星期(0~52), 這裏星期天是星期的第一天
%u 星期(0~52), 這裏星期一是星期的第一天
%% 輸出%
1 mysql> select from_unixtime(1619871620,'%Y-%m-%d %H:%i:%s'),from_unixtime(1619871620);
2 +-----------------------------------------------+---------------------------+
3 | from_unixtime(1619871620,'%Y-%m-%d %H:%i:%s') | from_unixtime(1619871620) |
4 +-----------------------------------------------+---------------------------+
5 | 2021-05-01 20:20:20                           | 2021-05-01 20:20:20       |
6 +-----------------------------------------------+---------------------------+
7 1 row in set

獲取月份:month

MONTH(date) 函數:data爲必填參數,返回date對應的月份,範圍爲 1~12。

1 mysql> select month(now()),month('2020-05-15');
2 +--------------+---------------------+
3 | month(now()) | month('2020-05-15') |
4 +--------------+---------------------+
5 |           11 |                   5 |
6 +--------------+---------------------+
7 1 row in set

獲取月份名稱:monthname

MONTHNAME(date) 函數:date爲必填參數,返回對應的月份名稱。

1 mysql> select monthname(now()),monthname('2020-05-15');
2 +------------------+-------------------------+
3 | monthname(now()) | monthname('2020-05-15') |
4 +------------------+-------------------------+
5 | November         | May                     |
6 +------------------+-------------------------+
7 1 row in set

周名稱/數值:dayname/dayofweek

1 mysql> select now(),dayname(now()),dayofweek(now());
2 +---------------------+----------------+------------------+
3 | now()               | dayname(now()) | dayofweek(now()) |
4 +---------------------+----------------+------------------+
5 | 2020-11-28 11:13:03 | Saturday       |                7 |
6 +---------------------+----------------+------------------+
7 1 row in set 

DAYNAME(date):返回的是指定日期的對應星期名稱,好比今天週六就是Saturday.

DAYWEEK(date):返回date對應的數值,這邊能夠看到週六返回的是7,這個是正確的,由於是從週日開始算的,週日是1,週一是2,...  ,週六是7。以下圖:

星期幾? 對應數值
星期日 0
星期一 1
星期二 2
星期三 3
星期四 4
星期五 5
星期六 6
星期日 7


獲取整年中的第n周:week

WEEK(date[,mode]) 函數:返回給定date 屬於一年中的第幾周。它包含兩個參數:

data是指定時間,在它所在年的第幾周。

mode爲可選參數,以下面這個表,用於肯定週數計算的邏輯。指定本週是從星期一仍是星期日開始,返回的週數應在052之間或053之間。 

模式 星期的第一天 範圍 星期 1 是第一天
0 Sunday 0-53 一年中多一個星期天
1 Monday 0-53 一年多3天
2 Sunday 1-53 一年中多一個星期天
3 Monday 1-53 一年多3天
4 Sunday 0-53 一年多3天
5 Monday 0-53 一年中多一個星期一
6 Sunday 1-53 一年多3天
7 Monday 1-53 一年中多一個星期一

由於是可選參數,因此若是默認狀況下WEEK函數將使用default_week_format系統變量的值。不一樣人的系統參數配置可能不同,能夠看看本身的配置是什麼:這邊查出是0,則表明從星期的第一天爲sunday。


1
mysql> SHOW VARIABLES LIKE 'default_week_format'; 2 +---------------------+-------+ 3 | Variable_name | Value | 4 +---------------------+-------+ 5 | default_week_format | 0 | 6 +---------------------+-------+ 7 1 row in set

 

咱們作個測試:

1 mysql> select WEEK('2021-1-1'),WEEK('2021-1-1',0),WEEK('2021-1-1',2);
2 +------------------+--------------------+--------------------+
3 | WEEK('2021-1-1') | WEEK('2021-1-1',0) | WEEK('2021-1-1',2) |
4 +------------------+--------------------+--------------------+
5 |                0 |                  0 |                 52 |
6 +------------------+--------------------+--------------------+
7 1 row in set

年中的日期位置:dayofyear

1 mysql> select now(),dayofyear(now()),dayofyear('2020-12-31');
2 +---------------------+------------------+-------------------------+
3 | now()               | dayofyear(now()) | dayofyear('2020-12-31') |
4 +---------------------+------------------+-------------------------+
5 | 2020-11-28 12:27:25 |              333 |                     366 |
6 +---------------------+------------------+-------------------------+
7 1 row in set

月中的日位置:dayofmonth

1 select now(),dayofmonth(now()),dayofmonth('2020-12-31');
2 +---------------------+-------------------+--------------------------+
3 | now()               | dayofmonth(now()) | dayofmonth('2020-12-31') |
4 +---------------------+-------------------+--------------------------+
5 | 2020-11-28 12:29:03 |                28 |                       31 |
6 +---------------------+-------------------+--------------------------+
7 1 row in set

返回年信息:year

1 mysql> select now(),year(now()),year('2020-08-08');
2 +---------------------+-------------+--------------------+
3 | now()               | year(now()) | year('2020-08-08') |
4 +---------------------+-------------+--------------------+
5 | 2020-11-28 12:34:31 |        2020 |               2020 |
6 +---------------------+-------------+--------------------+
7 1 row in set

時間和秒的互轉:time_to_sec/sec_to_time

TIME_TO_SEC(time) 函數將參數 time 轉換爲秒數的時間值,公式:" h×3600+ m ×60+ s"。

SEC_TO_TIME(seconds) 函數返回將參數 seconds 轉換爲時、分、秒時間值。

1 mysql> select now(),time_to_sec(now()),sec_to_time(23*3600 + 59*60 + 59);
2 +---------------------+--------------------+-----------------------------------+
3 | now()               | time_to_sec(now()) | sec_to_time(23*3600 + 59*60 + 59) |
4 +---------------------+--------------------+-----------------------------------+
5 | 2020-11-28 12:43:02 |              45782 | 23:59:59                          |
6 +---------------------+--------------------+-----------------------------------+
7 1 row in set

日期加法:date_add/adddate

日期時間加法函數:DATE_ADD(date,INTERVAL expr type),包含兩個參數:

date:參數是日期格式。expr 參數是時間間隔。

type:時間間隔類型,參數以下

 

type字段的類型
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

測試一下:分別輸出間隔一天、一小時、一分鐘的時間:

1 mysql> select now(),date_add(now(),interval 1 day),adddate(now(),interval 1 HOUR),adddate(now(),interval 1 MINUTE);
2 +---------------------+--------------------------------+--------------------------------+----------------------------------+
3 | now()               | date_add(now(),interval 1 day) | adddate(now(),interval 1 HOUR) | adddate(now(),interval 1 MINUTE) |
4 +---------------------+--------------------------------+--------------------------------+----------------------------------+
5 | 2020-11-28 14:26:24 | 2020-11-29 14:26:24            | 2020-11-28 15:26:24            | 2020-11-28 14:27:24              |
6 +---------------------+--------------------------------+--------------------------------+----------------------------------+
7 1 row in set

 

也能夠爲負數,負數則爲相反的意思:

1 mysql> select now(),date_add(now(),interval -1 day),adddate(now(),interval -1 HOUR),adddate(now(),interval -1 MINUTE);
2 +---------------------+---------------------------------+---------------------------------+-----------------------------------+
3 | now()               | date_add(now(),interval -1 day) | adddate(now(),interval -1 HOUR) | adddate(now(),interval -1 MINUTE) |
4 +---------------------+---------------------------------+---------------------------------+-----------------------------------+
5 | 2020-11-28 14:28:34 | 2020-11-27 14:28:34             | 2020-11-28 13:28:34             | 2020-11-28 14:27:34               |
6 +---------------------+---------------------------------+---------------------------------+-----------------------------------+
7 1 row in set

 

日期加法:date_sub/subdate

DATE_SUB(date,INTERVAL expr type),參數與上面日期加法一致,測試一下,分別減去1年、1時、1分:

1 mysql> select now(),date_sub(now(),interval 1 day),subdate(now(),interval 1 HOUR),subdate(now(),interval 1 MINUTE);
2 +---------------------+--------------------------------+--------------------------------+----------------------------------+
3 | now()               | date_sub(now(),interval 1 day) | subdate(now(),interval 1 HOUR) | subdate(now(),interval 1 MINUTE) |
4 +---------------------+--------------------------------+--------------------------------+----------------------------------+
5 | 2020-11-28 14:31:49 | 2020-11-27 14:31:49            | 2020-11-28 13:31:49            | 2020-11-28 14:30:49              |
6 +---------------------+--------------------------------+--------------------------------+----------------------------------+
7 1 row in set

時間加減法:addtime/subtime

ADDTIME(time,expr)、SUBTIME(time,expr) 函數用於執行時間的加減法運算。
參數time: 是一個時間或日期時間表達式
參數expr: 是一個時間表達式

測試一下:

1 mysql> select now(),addtime(now(),'1:1:1'),subtime(now(),'1:1:1');
2 +---------------------+------------------------+------------------------+
3 | now()               | addtime(now(),'1:1:1') | subtime(now(),'1:1:1') |
4 +---------------------+------------------------+------------------------+
5 | 2020-11-28 14:40:53 | 2020-11-28 15:41:54    | 2020-11-28 13:39:52    |
6 +---------------------+------------------------+------------------------+
7 1 row in set

 

日期間隔函數:datediff

獲取兩個日期的間隔,由於只計算日期部分,因此實際是第一個日期減去第二個日期的差額天數,測試一下:

 

1 mysql> select now(),datediff(now(),adddate(now(),interval 15 day)),datediff(now(),subdate(now(),interval 1 month));
2 +---------------------+------------------------------------------------+-------------------------------------------------+
3 | now()               | datediff(now(),adddate(now(),interval 15 day)) | datediff(now(),subdate(now(),interval 1 month)) |
4 +---------------------+------------------------------------------------+-------------------------------------------------+
5 | 2020-11-28 14:45:49 |                                            -15 |                                              31 |
6 +---------------------+------------------------------------------------+-------------------------------------------------+
7 1 row in set

格式化日期:date_format

DATE_FORMAT(date,format) 函數:將咱們的日期進行格式化顯示。
包含兩個參數:
date參數:要進行格式化的日期值
format參數:格式符號,這個能夠參考上面那個時間戳格式化的那個表格。

測試一下:

1 mysql> select DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'),DATE_FORMAT(NOW(),'%d %b %y'),DATE_FORMAT(NOW(),'%d %b %Y %T:%f');
2 +----------------------------------------+-------------------------------+-------------------------------------+
3 | DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s') | DATE_FORMAT(NOW(),'%d %b %y') | DATE_FORMAT(NOW(),'%d %b %Y %T:%f') |
4 +----------------------------------------+-------------------------------+-------------------------------------+
5 | 2020-11-28 14:59:05                    | 28 Nov 20                     | 28 Nov 2020 14:59:05:000000         |
6 +----------------------------------------+-------------------------------+-------------------------------------+
7 1 row in set

周的索引:weekday

注意與dayofweek的區別,dayofweek是周天爲1,週一到週六爲2~7。而WEEKDAY(date) 返回date的周索引(0=週一,1=週二, ……6= 周天)。

今天是週六,測試一下:

1 mysql> select now(),dayofweek(now()),weekday(now());
2 +---------------------+------------------+----------------+
3 | now()               | dayofweek(now()) | weekday(now()) |
4 +---------------------+------------------+----------------+
5 | 2020-11-28 15:03:52 |                7 |              5 |
6 +---------------------+------------------+----------------+
7 1 row in set

MySQL 聚合函數

這個在分組函數那一章學習過了,你們能夠參考下:MySQL全面瓦解10:分組查詢和聚合函數

MySQL 流程控制函數

後續會有專門的章節進行詳解。

總結

mysql的系統函數仍是比較強大的,一個個驗證寫了快一天,淚崩,若是能熟練使用到咱們開發中會事半功倍。這篇分類清晰,能夠看成參考工具使用。

相關文章
相關標籤/搜索