MySQL 日期時間函數


datetime和timestamp區別:

  1. 存儲方式不一樣,IMESTAMP,它把客戶端插入的時間從當前時區轉化為UTC(世界標准時間)進行存儲。查詢時,將其又轉化為客戶端當前時區進行返回。而對於DATETIME,不做任何改變,基本上是原樣輸入和輸出。
  2. 占用存儲空間不同。timestamp儲存占用4個字節,datetime儲存占用8個字節
  3. 可表示的時間范圍不同。timestamp可表示范圍:1970-01-01 00:00:00~2038-01-09 03:14:07,datetime支持的范圍更寬1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
  4. TIMESTAMP類型在默認情況下,insert、update 數據時,TIMESTAMP列會自動以當前時間(CURRENT_TIMESTAMP)填充/更新。
  5. 索引速度不同。timestamp更輕量,索引相對datetime更快。

timestamp類型字段特殊性:

timestamp類型在自動初始化的時候,會自動設置成當前時間,會自動更新,默認的設置為:

Copy
`field` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

如果不想要這樣,可以將timestamp設置為默認為空或者設置具體的默認值。

具體可以查看文章底部鏈接。


Mysql獲取日期時間函數:

now()

sysdate() 日期時間函數跟 now() 類似,不同之處在於:now() 在執行開始時值就得到了, sysdate() 在函數執行時動態得到值。

Copy
mysql> select now(), sleep(3), now(); +---------------------+----------+---------------------+ | now() | sleep(3) | now() | +---------------------+----------+---------------------+ | 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 | +---------------------+----------+---------------------+ mysql> select sysdate(), sleep(3), sysdate(); +---------------------+----------+---------------------+ | sysdate() | sleep(3) | sysdate() | +---------------------+----------+---------------------+ | 2008-08-08 22:28:41 | 0 | 2008-08-08 22:28:44 | +---------------------+----------+---------------------+

可以看到,雖然中途 sleep 3 秒,但 now() 函數兩次的時間值是相同的; sysdate() 函數兩次得到的時間值相差 3 秒.

curdate()

Copy
select curdate(); +------------+ | curdate() | +------------+ | 2008-08-08 | +------------+

其中,下面的兩個日期函數等同於 curdate():
current_date() ,current_date

curtime()

Copy
 select curtime(); +-----------+ | curtime() | +-----------+ | 22:41:30 | +-----------+

其中,下面的兩個時間函數等同於 curtime():
current_time() ,current_time

Extract()

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

Copy
set @dt = '2008-09-10 07:15:30.123456'; select date(@dt); -- 2008-09-10 select time(@dt); -- 07:15:30.123456 select year(@dt); -- 2008 select quarter(@dt); -- 3 select month(@dt); -- 9 select week(@dt); -- 36 select day(@dt); -- 10 select hour(@dt); -- 7 select minute(@dt); -- 15 select second(@dt); -- 30 select microsecond(@dt); -- 123456

Extract() 函數,可以上面實現類似的功能

Copy
set @dt = '2008-09-10 07:15:30.123456'; select extract(year from @dt); -- 2008 select extract(quarter from @dt); -- 3 select extract(month from @dt); -- 9 select extract(week from @dt); -- 36 select extract(day from @dt); -- 10 select extract(hour from @dt); -- 7 select extract(minute from @dt); -- 15 select extract(second from @dt); -- 30 select extract(microsecond from @dt); -- 123456 select extract(year_month from @dt); -- 200809 select extract(day_hour from @dt); -- 1007 select extract(day_minute from @dt); -- 100715 select extract(day_second from @dt); -- 10071530 select extract(day_microsecond from @dt); -- 10071530123456 select extract(hour_minute from @dt); -- 715 select extract(hour_second from @dt); -- 71530 select extract(hour_microsecond from @dt); -- 71530123456 select extract(minute_second from @dt); -- 1530 select extract(minute_microsecond from @dt); -- 1530123456 select extract(second_microsecond from @dt); -- 30123456

last_day()

last_day() 函數:返回月份中的最后一天。
select last_day('2008-02-01'); -- 2008-02-29
select last_day('2008-08-08'); -- 2008-08-31

MySQL last_day() 函數非常有用,比如我想得到當前月份中有多少天,可以這樣來計算:

Copy
 select now(), day(last_day(now())) as days; +---------------------+------+ | now() | days | +---------------------+------+ | 2008-08-09 11:45:45 | 31 | +---------------------+------+

Mysql日期時間計算函數:

date_add()

Copy
set @dt = now(); select date_add(@dt, interval 1 day); -- add 1 day select date_add(@dt, interval 1 hour); -- add 1 hour select date_add(@dt, interval 1 minute); -- ... select date_add(@dt, interval 1 second); select date_add(@dt, interval 1 microsecond); select date_add(@dt, interval 1 week); select date_add(@dt, interval 1 month); select date_add(@dt, interval 1 quarter); select date_add(@dt, interval 1 year); select date_add(@dt, interval -1 day); -- sub 1 day

MySQL adddate(), addtime()函數,可以用 date_add() 來替代。

下面是 date_add() 實現 addtime() 功能示例:

Copy
 set @dt = '2008-08-09 12:12:33'; select date_add(@dt, interval '01:15:30' hour_second); +------------------------------------------------+ | date_add(@dt, interval '01:15:30' hour_second) | +------------------------------------------------+ | 2008-08-09 13:28:03 | +------------------------------------------------+ select date_add(@dt, interval '1 01:15:30' day_second); +-------------------------------------------------+ | date_add(@dt, interval '1 01:15:30' day_second) | +-------------------------------------------------+ | 2008-08-10 13:28:03 | +-------------------------------------------------+

date_add() 函數,分別為 @dt 增加了“1小時 15分 30秒” 和 “1天 1小時 15分 30秒”。

date_sub()

Copy
select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second); +----------------------------------------------------------------+ | date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) | +----------------------------------------------------------------+ | 1997-12-30 22:58:59 | +----------------------------------------------------------------+

date_sub() 日期時間函數 和 date_add() 用法一致,不再贅述。

另外,MySQL 中還有兩個函數 subdate(), subtime(),建議,用 date_sub() 來替代。

datediff(),timediff()

日期、時間相減函數:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):兩個日期相減 date1 - date2,返回天數。

Copy
select datediff('2008-08-08', '2008-08-01'); -- 7 select datediff('2008-08-01', '2008-08-08'); -- -7

timediff(time1,time2):兩個日期相減 time1 - time2,返回 time 差值。

Copy
select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08 select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函數的兩個參數類型必須相同。

str_to_date()

(字符串轉換為日期)函數:str_to_date(str, format)

Copy
select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09 select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09 select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09 select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30 select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

date_format(),time_format()

將日期,時間轉換成字符串,是str_to_date()的逆轉換

Copy
select date_format('2008-08-08 22:23:00', '%W %M %Y'); +------------------------------------------------+ | date_format('2008-08-08 22:23:00', '%W %M %Y') | +------------------------------------------------+ | Friday August 2008 | +------------------------------------------------+ select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s'); +----------------------------------------------------+ | date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') | +----------------------------------------------------+ | 20080808222301 | +----------------------------------------------------+ select time_format('22:23:01', '%H.%i.%s'); +-------------------------------------+ | time_format('22:23:01', '%H.%i.%s') | +-------------------------------------+ | 22.23.01 | +-------------------------------------+

MySQL 時區(timezone)轉換函數:

convert_tz(dt,from_tz,to_tz)

Copy
select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

時區轉換也可以通過 date_add, date_sub, timestampadd 來實現。
select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

參考:

MySQL:日期函數、時間函數總結(MySQL 5.X)

MySQL 日期與時間方面的函數

mysql之DATETIME、DATE和TIMESTAMP簡單了解

MySQL中有關TIMESTAMP和DATETIME的總結

作者:hongda

出處:https://www.cnblogs.com/hongdada/p/9929332.html

版權:本站使用「署名 4.0 國際」創作共享協議,轉載請在文章明顯位置注明作者及出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM