有趣的SQL時間函數


-- 001 NOW(),獲取當前日期和時間的函數。
SELECT NOW()

-- 002 CURDATE,獲取當前的日期
SELECT CURDATE()

-- 003 CURTIME(),獲取當前時間
SELECT CURTIME();

-- 004 DATA() 獲取日期時間或者日期的日期部分
SELECT DATE('2020-04-01 00:11:06')
SELECT DATE('2020-04-01')
SELECT date(now());

-- 005 EXTRACT,獲取返回日期/時間的單獨部分,比如年、月、日、小時、分鐘等等。
-- 語法:EXTRACT(unit FROM date)
-- 注意:取出單獨部分

 獲取當前年月
select EXTRACT(YEAR_MONTH FROM now());
select EXTRACT(DAY_HOUR FROM now()); 
select EXTRACT(DAY_MINUTE FROM now()) AS a;
select EXTRACT(DAY_SECOND FROM now()) AS a;


獲取當前周
SELECT EXTRACT(WEEK FROM NOW())

獲取當前月份
SELECT EXTRACT(MONTH FROM NOW())
SELECT EXTRACT(MONTH FROM '2020-03-01 00:11:06') #探索式,結果成立
SELECT EXTRACT(MONTH FROM '202004') #探索式,結果爲空,無效值 ①
SELECT EXTRACT(MONTH FROM '20200401') #探索式成功 ②
/*
由①②得,日期格式完整性很重要!!!
*/


獲取當前季度
SELECT EXTRACT(QUARTER FROM NOW())

獲取當前日期 + 時間
SELECT EXTRACT(MINUTE_SECOND FROM NOW()) # 理解上有些唐突
SELECT EXTRACT(MINUTE FROM NOW());
SELECT EXTRACT(MONTH FROM NOW());


-- 006 將日期添加指定的時間間隔。
-- 語法:DATE_ADD(date,INTERVAL expr type)

獲取兩週後的時間
select DATE_ADD(now(),INTERVAL 2 WEEK);

-- 007 DATE_SUB:將日期減去指定的時間間隔。
-- 語法:DATE_SUB(date,INTERVAL expr type)

 獲取兩天前的時間
SELECT DATE_SUB(NOW(),INTERVAL 2 DAY); --負負得正!!!
SELECT DATE_SUB(NOW(),INTERVAL -2 DAY);
-- OR
select DATE_ADD(now(),INTERVAL -2 DAY);


-- 008 DATEDIFF
-- 獲取兩個日期之間的天數。(只有日期部分參與計算)
-- 語法:DATEDIFF(date1,date2)
-- date1 和 date2 參數是合法的日期或日期/時間表達式。(何謂合法?)

date1 和 date2 參數是合法的日期或日期/時間表達式。
SELECT DATEDIFF(NOW(),'2008-08-08') AS '北京奧運會多天前'
SELECT DATEDIFF(NOW(),'20080808') AS '北京奧運會多天前' # 探索結果成立
SELECT DATEDIFF('20080808',NOW()); -- 最近的日期放前面,否則出現負值;


-- 009 DATE_FORMAT

-- 格式化日期時間
-- 語法:DATE_FORMAT(date,format)
-- date 參數是合法的日期。format 規定日期/時間的輸出格式。

-- 年
SELECT DATE_FORMAT('2019-06-08','%Y') # 返回年,4位
SELECT DATE_FORMAT('2019-06-08','%y') -- 年,2位
SELECT DATE_FORMAT('20190608','%Y') # 探索OK


-- 以一週爲單位
SELECT DATE_FORMAT(now(),'%w') # 返回周的天(0 = 星期日, 6 = 星期六)
SELECT DATE_FORMAT(now(),'%W') # 返回星期名

-- 以年爲單位,表示一年的多少周

-- %V:周 (01-53) 星期日是一週的第一天,與 %X 使用
SELECT DATE_FORMAT(now(),'%V')
SELECT DATE_FORMAT('20200419','%V')
SELECT DATE_FORMAT('20200418','%V')

-- %v:周 (01-53) 星期一是一週的第一天,與 %x 使用
SELECT DATE_FORMAT('20200419','%v')

-- 更多請自主探索;建議根據業務需要做中學;


/*
作者:@zhangjunhong
一文搞定Mysql日期時間函數 
https://mp.weixin.qq.com/s/0Y_AjWjgn5KjisWP22RTxg
*/

/*
1.獲取當前時刻時間
    1.1返回當前時刻的日期和時間
    1.2獲取當前時刻的日期
    1.3獲取當前時刻的時間
    1.4獲取當前時刻的週數
2.日期時間格式轉換
3.日期時間運算
    3.1向後偏移時間
    3.2向前偏移時間
    3.3兩日期做差
*/
-- 1.獲取當前時刻時間
-- 1.1返回當前時刻的日期和時間
select now() -- 當前時間爲:2020-04-19 21:31:07

-- 1.2獲取當前時刻的日期
SELECT curdate(); -- 獲取當前時刻的日期部分

/*
curdate()函數是直接獲取當前時刻的日期部分,
我們也可以先通過now()函數獲取當前時刻的日期時間,
然後再通過date()函數將日期時間轉化爲日期部分
*/

SELECT date(now()); -- 目的同上;
SELECT YEAR(now()); -- 獲取日期中的年;
SELECT MONTH(now()); -- 獲取日期中的月;
SELECT DAY(now()); -- 只獲取日期中的日;


-- 1.3獲取當前時刻的時間
SELECT curtime(); -- 獲取當前時刻的時間部分

/*
也可以先通過now()函數獲取當前時刻的日期時間,
然後再通過time()函數將日期時間轉化爲時間部分,具體代碼如下:
*/
SELECT time(now()); -- time()函數將日期時間轉化爲時間部分
SELECT HOUR(now()); -- 獲取時間中的小時;
SELECT minute(now()); -- 獲取時間中的分鐘;
SELECT SECOND(now()); -- 獲取時間中的秒;

-- 1.4獲取當前時刻的週數
SELECT WEEKOFYEAR(now());-- 全年的第幾周;

SELECT DAYOFWEEK(now());-- 一週內的周幾:周天對應的是1

-- 2.日期時間格式轉換
select date_format("2019-01-01 22:47:37","%y-%m-%d") -- %Y 對應4位數的年,%y 對應2位數的年 
select date_format("2019-01-01 22:47:37","%Y-%m-%d") -- %m 01-12的月
select date_format("2019-01-01 22:47:37","%Y-%c-%d") -- %c 1-12的月
select date_format("2019-01-01 22:47:37","%Y-%M-%d") -- %M 月份對應的英文全稱	
select date_format("2019-01-01 22:47:37","%Y-%b-%d") -- %M 月份對應的英文縮寫	

select date_format("2019-12-25 22:47:37","%H:%i:%S") -- %H 對應00-23小時
select date_format("2019-12-25 22:47:37","%T") -- %T 返回當前的時分秒 24-小時(hh:mm:ss)

select date_format("2019-12-25 22:47:37","%h:%i:%S") -- %h 對應01-12小時
select date_format("2019-12-25 22:47:37","%h") -- 僅返回日期時間中的"小時"數;

-- extract 用於返回具體日期時間中的單獨部分,比如年、月、日、小時、分鐘等等
-- 具體形式如下:
extract(unit from datetime)

select
    extract(year from "2019-12-25 22:47:37") as col1
    ,extract(month from "2019-12-25 22:47:37") as col2
	,extract(week from "2019-12-25 22:47:37") as col3
    ,extract(day from "2019-12-25 22:47:37")  as col4
	,extract(hour from "2019-12-25 22:47:37")  as col5
	,extract(minute from "2019-12-25 22:47:37")  as col6
	,extract(minute from "2019-12-25 22:47:37")  as col7
	,extract(second from "2019-12-25 22:47:37")  as col8;
		
-- 3.日期時間運算
/*
有的時候我們也需要對日期之間進行運算,
比如我要獲取今天往前7天對應的日期,
或者今天往後13天對應的日期,可以去翻日曆,也可以去數數,
但是這些方法肯定都不是最直接的方法。
所以需要日期之間的運算。
*/

-- 3.1向後偏移時間
date_add(date,interval x unit) -- date表示當前的日期,或者當前的日期時間;interval是一個固定的參數;

select 
    "2019-01-01" as col1 -- 初始化時間
    ,date_add("2019-01-01",interval 7 year) as col2
    ,date_add("2019-01-01",interval 7 month) as col3
    ,date_add("2019-01-01",interval 7 day) as col4


select 
    "2019-01-01 01:01:01" as col1
    ,date_add("2019-01-01 01:01:01",interval 7 hour) as col2
    ,date_add("2019-01-01 01:01:01",interval 7 minute) as col3
    ,date_add("2019-01-01 01:01:01",interval 7 second) as col4;


-- 3.2向前偏移時間 
-- date_sub()函數
select 
    "2019-01-01" as col1
    ,date_sub("2019-01-01",interval 7 year) as col2
    ,date_sub("2019-01-01",interval 7 month) as col3
    ,date_sub("2019-01-01",interval 7 day) as col4

-- 也可繼續使用date_add()函數
-- 通過運行上面的結果與使用date_sub得出來的結果是一致的。
select 
    "2019-01-01" as col1
    ,date_add("2019-01-01",interval -7 year) as col2
    ,date_add("2019-01-01",interval -7 month) as col3
    ,date_add("2019-01-01",interval -7 day) as col4

-- 3.3兩日期/時間做差
-- 大的日期/時間需要在第一個參數的位置,則返回正數,否則返回負數;
select datediff("2019-01-07","2019-01-01")
select datediff("2019-01-01","2019-01-07") -- 爲負值,最近日期放在前面較妥當;

SELECT timediff('23:23:49','23:09:49');--返回的是時分秒的格式;

-- hayangteacher-常用時間函數

SELECT DAYOFWEEK('2020-04-19 23:09:49');-- 返回date所代表的一星期中的第幾天(1~7),1是星期天,7是星期六;
SELECT weekday('2020-04-19') -- 返回date所代表的一星期中的第幾天(0~6),0是週一,6是星期天;
SELECT DAYOFMONTH('2020-04-19 23:09:49'); -- 返回date是一年中的第幾天(1~31)
SELECT DAYOFYEAR('2020-04-19 23:09:49');-- 返回date是一年的第幾天(1~366)
SELECT DAYNAME('20200419') -- 返回date的星期名
SELECT DAYNAME('2020-04-19 23:09:49') -- 返回date的星期名
SELECT MONTH('20200419') -- 返回統計的月份(1-4)
SELECT MONTHNAME('20200419') -- 返回月份名
SELECT WEEK('20200419') -- 返回日期date爲一年中的第幾周(0~53)
SELECT QUARTER('20200419') -- 返回date所在季度(1~4)
SELECT HOUR('2020-04-19 23:09:49') -- 返回time的小時值(0-23)
SELECT MINUTE('2020-04-19 23:09:49') -- 返回time的分鐘值(0-59)

-- 把字符類型轉換爲時間類型:STR_TO_DATE(str,format)

SELECT str_to_date('2020-04-09','%Y-%m-%d')
SELECT '2020-04-09'; -- 暫且到此

更多閱讀文獻研討:

https://www.cnblogs.com/ggjucheng/p/3352280.html

https://baijiahao.baidu.com/s?id=1608326786755050044&wfr=spider&for=pc

https://mp.weixin.qq.com/s/0Y_AjWjgn5KjisWP22RTxg

附圖1:

date_format(datetime,format)
datetime表示要被轉換的具體的日期時間,format表示要轉換成的格式,可選的格式
在這裏插入圖片描述
附圖2:

extract(unit from datetime)
datetime表示具體的日期時間,unit表示要從datetime中返回的單獨的部分。unit值可以是下列的值:
在這裏插入圖片描述

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