mysql語法-日期時間函數


1. 獲取系統日期、時間

1.1 now()

now([fsp]):返回系統當前的日期和時間(fsp指定小數秒的精度,取值0-6)。

1. select now();
2. select now(2);   # 指定小數秒的精度
3. select now()+0;  # now()+0顯示格式是‘YYYYMMDDHHMMSS’
->
1. 2020-02-18 19:36:39
2. 2020-02-18 19:36:39.46
3. 20200218193639

1.2 sysdate()

sysdate([fsp]):返回系統當前的日期和時間,但一般用now()。

sysdate()返回的是函數執行時的時間。
now()返回的是語句執行時的時間。

1. select sysdate();
2. select now(),sleep(2),now();
3. select sysdate(),sleep(2),sysdate();
->
1. 2020-02-18 19:36:39
2. 2020-02-18 19:42:11    0    2020-02-18 19:42:11
3. 2020-02-18 19:42:13    0    2020-02-18 19:42:15

1.3 curdate()

curdate():返回當前日期,只包含年月日。

1. select curdate();
2. select curdate()+2; # 當前日期加2天
->
1. 2020-02-18
2. 20200220

1.4 curtime()

curtime([fsp]):返回當前時間,只包含時分秒(fsp指定小數秒的精度,取值0-6)。

1. select curtime();
2. select curtime(6);
3. select curtime()+2;  # 加2秒
->
1. 19:49:39
2. 19:49:39.354219
3. 194941

2. 日期、時間相減

2.1 datediff()

datediff(expr1,expr2):返回兩個日期相減的天數(expr1 - expr2)。

select datediff('2020-04-18 10:00:00','2010-02-18');
->
3712

2.2 timediff()

timediff(expr1, expr2):返回兩個時間相減的時間數(expr1 − expr2),兩個參數類型必須相同。範圍在-838:59:59到838:59:59。

timestampdiff(unit,begin,end):根據unit單位返回時間差。

1. select timediff('18:32:59','00:1:00');
2. select timediff('2020-02-18 10:00:00','10:00:00'); # 如果傳遞兩個不同類型的參數,返回null
3. select timediff('2020-02-18 10:00:00','2020-02-15');
4. select timediff('2020-02-18 10:00:00',null); 
5. select timediff('2020-04-18 10:00:00','2020-02-18 10:00:00'); # timediff函數返回的結果是一個time值,範圍是從-838:59:59到838:59:59。當範圍超過的時候,MySQL會截斷結果。
6. select timestampdiff(hour,'2020-04-18 10:00:00','2020-02-18 10:00:00') # 解決範圍超過截斷的問題。
->
1. 18:31:59
2. null
3. null
4. null
5. 838:59:59
6. -1440

3. 日期、時間運算函數

3.1 date_add()

date_add(date,interval expr unit):返回給定日期(date)加上(add)一個時間單位(unit)的值(expr)。

1. select date_add('2020-02-18 10:00:00',interval 1 day); # 增加一天
2. select date_add('2020-02-18 10:00:00',interval 1 hour);
3. select date_add('2020-02-18 10:00:00',interval 1 second);
4. select date_add('2020-02-18 10:00:00',interval 1 microsecond); # 微秒
5. select date_add('2020-02-18 10:00:00',interval 1 year);
6. select date_add('2020-02-18 10:00:00',interval 1 month);
7. select date_add('2020-02-18 10:00:00',interval 1 day);
8. select date_add('2020-02-18 10:00:00',interval 1 week); # 一個星期,加7天
9. select date_add('2020-02-18 10:00:00',interval 1 quarter); # 1個季度,加3個月
->
1. 2020-02-19 10:00:00
2. 2020-02-18 11:00:00
3. 2020-02-18 10:00:01
4. 2020-02-18 10:00:000001
5. 2021-02-18 10:00:00
6. 2020-03-18 10:00:00
7. 2020-02-19 10:00:00
8. 2020-02-25 10:00:00
9. 2020-05-18 10:00:00

3.2 date_sub()

date_sub(date,interval expr unit):返回給定日期(date)減去(sub)一個時間單位(unit)的值(expr)。

1. select date_sub('2020-02-18',interval '1-1' year_month); # 年和月,減1年1個月
2. select date_sub('2020-02-18',interval '1 1' day_hour);  # 日和小時,減1天1小時
3. select date_sub('2020-02-18',interval '1 0:1' day_minute); # 日和分鐘,減1天1分鐘
4. select date_sub('2020-02-18',interval '1 0:0:1' day_second); # 日和秒,減1天1秒
5. select date_sub('2020-02-18',interval '1:1' hour_minute); # 小時和分鐘,減1小時1分鐘
6. select date_sub('2020-02-18',interval '1:0:1' hour_second); # 小時和秒,減1小時1秒
7. select date_sub('2020-02-18',interval '1:1' minute_second); # 分鐘和秒,減1分鐘1秒,寫0:1:1返回空值。
->
1. 2019-01-19
2. 2020-02-16 23:00:00
3. 2020-02-16 23:59:00
4. 2020-02-16 23:59:59
5. 2020-02-17 22:59:00
6. 2020-02-17 22:59:59
7. 2020-02-17 23:58:59

4. 日期、時間函數

選取日期時間的各個部分:日期、時間、年、季度、月、日、小時、分鐘、秒、微秒。

1. select now(),date(now());
2. select now(),time(now());
3. select now(),year(now());
4. select now(),quarter(now());
5. select now(),month(now());
6. select now(),day(now());
7. select now(),hour(now());
8. select now(),minute(now());
9. select now(),second(now());
10.select now(),microsecond(now());
->
1. 2020-02-18 23:18:54  2020-02-18
2. 2020-02-18 23:18:54  23:18:54
3. 2020-02-18 23:18:54  2020
4. 2020-02-18 23:18:54  1
5. 2020-02-18 23:18:54  2
6. 2020-02-18 23:18:54  18
7. 2020-02-18 23:18:54  23
8. 2020-02-18 23:18:54  18
9. 2020-02-18 23:18:54  54
10.2020-02-18 23:18:54  0

EXTRACT(unit FROM date):從日期、時間中抽取出某個單獨的部分或組合。

1. SELECT now(),extract(YEAR FROM now()); -- 年
2. SELECT now(),extract(QUARTER FROM now()); -- 季度
3. SELECT now(),extract(MONTH FROM now()); -- 月
4. SELECT now(),extract(WEEK FROM now()); -- 周,開年第一個星期從0開始算
5. SELECT now(),extract(DAY FROM now()); -- 日
6. SELECT now(),extract(HOUR FROM now()); -- 小時
7. SELECT now(),extract(MINUTE FROM now()); -- 分鐘
8. SELECT now(),extract(SECOND FROM now()); -- 秒
9. SELECT now(),extract(YEAR_MONTH FROM now()); -- 年月,沒有月日
10.SELECT now(),extract(HOUR_MINUTE FROM now()); -- 時分
11.SELECT now(),extract(HOUR_SECOND FROM now()); -- HOUR_SECOND時秒,不能跳過分鐘,返回時分秒
12.SELECT now(),extract(MINUTE_SECOND FROM now()); -- 分秒
->
1. 2020-02-18 23:18:54  2020
2. 2020-02-18 23:18:54  1
3. 2020-02-18 23:18:54  2
4. 2020-02-18 23:18:54  7  # 第7周
5. 2020-02-18 23:18:54  18
6. 2020-02-18 23:18:54  23
7. 2020-02-18 23:18:54  18
8. 2020-02-18 23:18:54  54
9. 2020-02-18 23:18:54  202002
10.2020-02-18 23:18:54  2318
11.2020-02-18 23:18:54  231854
12.2020-02-18 23:18:54  1854

5. dayofxxx(date)顯示xxx中的第幾天

dayofyear(date) 返回日期在一年中的第幾天。
dayofweek(date) 返回日期在一週中的第幾天。
dayofmonth(date) 返回日期在一月中的第幾天。

1. select now(),dayofyear(now());
2. select now(),dayofweek(now()); -- 週日爲1
3. select now(),dayofmonth(now());
->
1. 2020-02-18 23:42:26  49
2. 2020-02-18 23:42:26  3
3. 2020-02-18 23:42:26  18

6. 返回星期和月份名稱

dayname(date) 返回星期名稱
monthname(date) 返回月份名稱

1. select now(),dayname(now());
2. select now(),monthname(now());

# 名稱是中文or英文由系統變量lc_time_names控制(默認值是'en_US')。
show variables like 'lc_time_names';
# 設置爲中文
set lc_time_names='zh_CN';

3. select dayname(now()),monthname(now());
->
1. 2020-02-18 23:42:26  Tuesday
2. 2020-02-18 23:42:26  February
3. 星期二  二月

7.unix時間戳

unix_timestamp(date):返回日期(date)的時間戳(unix)。
-若參數不爲空,則返回從’1970-01-01 00:00:00’ GMT開始到指定date的秒數值。
-若參數爲空,則返回從’1970-01-01 00:00:00’ GMT開始到當前時間的秒數值。

from_unixtime():返回unix時間戳的日期值。
-將秒數轉爲日期,帶時分秒。

1. select now(),unix_timestamp(now()),unix_timestamp('2020-2-18');
2. select from_unixtime(unix_timestamp(now())),from_unixtime(unix_timestamp('2020-2-18'))
->
1. 2020-02-18 23:55:15  1582041315  1581955200
2. 2020-02-18 23:55:15  2020-02-18 00:00:00

8.date_format()函數

date_format(date,format):返回不同格式的日期或時間數據。
format格式大全

舉例:
%y:年,2位數
%m:月份,數值(00-12)
%d:月的天,數值(00-31)

%Y:年,4位數
%M:月份名稱
%D:帶有英文前綴的月中的天

%r:時間,12-小時(hh:mm:ss AM 或 PM)

1. select date_format('2020-2-18','%y%y %m %d'),date_format('2020-2-18','%Y/%M/%D')
2. select now(),date_format(now(),'%r') 
->
1. 2020 02 18            2020/二月/18th
2. 2020-02-19 00:18:34   12:18:34 AM

9.小案例

emp表
在這裏插入圖片描述

  1. 在emp表中,查詢所有工齡大於35年的員工信息。
    思路1:計算每個人入職時間hiredate+35年後,與如今now()相比,是否早就超過35年,還未超過35年的一定是>now()的(紅框的記錄就是工齡小於35年的)。
    在這裏插入圖片描述
    思路2:使用datediff()獲取天數,然後除365得年份,或者使用from_days()將天數轉爲日期,再year()獲取年份。
    在這裏插入圖片描述

  2. 在emp表中, 查詢在該月月底前兩天入職的員工信息。
    思路:使用date_add(date,interval expr unit)函數,入職時間+2天是否等於該月最後一天last_day(date),返回是的結果。
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章