mysql 日期類型與常見日期函數總結

mysql日期數據類型

日期時間類型 佔用空間 日期格式 最小值 最大值 零值表示
DATETIME 8字節 YYYY-mm-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00
TIMESTAMP 4字節 YYYY-mm-DD HH:MM:SS 1970-01-01 08-00-01 2038-01-19 03:14:07 00000000000000
DATE 4字節 YYYY-mm-DD 1000-01-01 9999-12-31 0000-00-00
TIME 3字節 HH:MM:SS -838:59:59 838:59:59 00:00:00
YEAR 1字節 YYYY 1901 2155 0000
  • mysql保存日期格式使用YYYY-mm-DD HH:MM:SS的iso 8601標準。
  • 其中,%y表示年,%m表示月,%d表示天,%h表示小時,%i表示分鐘,%s表示秒。
  • 注意timestamp類型,從1970-2038年,比如生日之類的超出範圍的就不適合。

mysql常見日期處理函數

1、獲取當前系統時間

方法 功能描述
now() 獲取系統當前的時間日期
current_timestamp() 獲取當前的時間日期
current_date() 獲取當前的日期
current_time() 獲取當前的時分秒

now()
作用: 獲取當前的日期時間。

select now();

current_timestamp()
作用: 獲取當前的日期時間。

select current_timestamp() 

current_date()
作用: 獲取當前的日期。

select current_date()

current_time()
作用: 獲取當前的時分秒。

select current_time()

2、獲取指定時間的年月日時分秒部分

方法 功能描述
year(timestamp|date) 獲取指定日期的年
month(timestamp|date) 獲取指定日期的月
day(timestamp|date) 獲取指定日期的天
hour(timestamp|hour) 獲取指定時間的小時
minute(timestamp|minute) 獲取指定時間的分鐘
second(timestamp|second) 獲取指定時間的秒
#year(),  month(), day()
#hour(), minute(), second()

select year(now()),  month(now()), day(now()), hour(now()), minute(now()), second(now())

3、獲取當前日期是本月的第幾天,本週的星期幾\

方法 功能描述
day(date|timestamp) 獲取當前日期爲本月的多少天
dayofweek(date|timestamp) 獲取當前日期爲本週的星期幾, 1-7,其中1表示星期日
weekday(date|timestamp) 獲取當前日期爲本週的星期幾, 0-6,其中0表示星期一
#day() 
#dayofweek()  結果爲1-7,其中1表示星期日;
#weekday()  結果爲0-6,其中0表示星期一;

select day(now()),  dayofweek(now()), weekday(now());

4、時間,日期轉換成字符串

方法 功能描述
date_format( timestamp date , format )
time_format( timestamp date , format )
#mysql中分鐘用 i%表示
select date_format( now(), '%Y-%m-%D %H:%i:%s' )
select date_format( now(), '%Y-%m-%D' )
select date_format( now(), '%H:%i:%d' )

select time_format( now(), '%H:%i:%d' )

5、時間日期查詢

可以把mysql中當做字符串來進行邏輯操作。比如 >; <; =; between and;

select * from test where birth = '1990-01-01';
select * from test where birth > '1991';
select * from test where birth < '1992-02-01';
select * from test where birth in ('1990-01-01', '1991-03-02', '1990-03-03' );
select * from test where birth BETWEEN '1990-01-01' and '2000-01-01';

6、兩個日期時間的差值計算

方法 功能描述
time_to_sec( time ) 時分秒轉成秒數;
sec_to_time(long) 秒數轉成時分秒;
to_days(date) 日期轉成天數;
from_days(long) 天數轉成日期;
datediff( date1, date2 ) 計算兩個日期的天數差值,結果以天數顯示。
timediff( time1, time2 ) 計算兩個時間的差值,結果以時分秒顯示。
timestampdiff( type, datetime, datetime ) 計算兩個日期,或者時間日期的差值,可以秒數,分數,小時,天數等顯示

時間轉秒數 time_to_sec

mysql> select time_to_sec('12:13:14');
+-------------------------+
| time_to_sec('12:13:14') |
+-------------------------+
|                   43994 |
+-------------------------+

秒數轉時間 sec_to_time

mysql> select sec_to_time(43994);
mysql> select sec_to_time(43994);
+--------------------+
| sec_to_time(43994) |
+--------------------+
| 12:13:14           |
+--------------------+

日期轉天數(相對於0000-00-00)

mysql> select to_days('0001-02-01');
+-----------------------+
| to_days('0001-02-01') |
+-----------------------+
|                   397 |
+-----------------------+

mysql> select to_days('1991-02-01');
+-----------------------+
| to_days('1991-02-01') |
+-----------------------+
|                727229 |
+-----------------------+

天數轉日期(相對於0000-00-00)

mysql> select from_days(726864);
+-------------------+
| from_days(726864) |
+-------------------+
| 1990-02-01        |
+-------------------+

比較兩個日期的天數差值 (只能比較年月日)

mysql> select datediff('1990-01-02', '2020-04-02');
+--------------------------------------+
| datediff('1990-01-02', '2020-04-02') |
+--------------------------------------+
|                               -11048 |
+--------------------------------------+

比較兩個時間的差值 (只能比較時分秒)

mysql> select TIMEDIFF('19:19:19','19:19:18');
+---------------------------------+
| TIMEDIFF('19:19:19','19:19:18') |
+---------------------------------+
| 00:00:01                        |
+---------------------------------+

比較兩個日期,時間的天數,秒數的差值。timestampdiff( , , ),比較日期或者時間日期組合,不能單獨比較時分秒。

mysql> select timestampdiff( day, '1990-01-02', '2020-04-02' );
+--------------------------------------------------+
| timestampdiff( day, '1990-01-02', '2020-04-02' ) |
+--------------------------------------------------+
|                                            11048 |
+-----------------------------------------------------------------------+

mysql> select timestampdiff( second, '1991-01-01 12:12:12', '1991-01-01 12:12:11' );
+-----------------------------------------------------------------------+
| timestampdiff( second, '1991-01-01 12:12:12', '1991-01-01 12:12:11' ) |
+-----------------------------------------------------------------------+
|                                                                    -1 |
+-----------------------------------------------------------------------+

7、時間,日期計算(遷移,後移)

方法 功能描述
addtime(timestamp, time) 當前時間推後指定時分秒。
timestamp( date )
timestamp(date, time)
字符串,日期 轉成時間戳; 以及後移指定時分秒
timestampadd( unit, interval, datetime_expr ) 指定字符串或者datetime,後移指定的天,時分秒等
date_add() 指定日期前移後移指定天數
date_sub()

timestamp( date | datetime ) : 將時間日期轉換成timestamp。
timestamp( date | datetime, time ) : 將時間日期轉換成timestamp,並且後移指定的時分秒。

#將日期或者日期字符串轉換成時間戳。
mysql> select timestamp('1990-01-01');
+-------------------------+
| timestamp('1990-01-01') |
+-------------------------+
| 1990-01-01 00:00:00     |
+-------------------------+

#將日期或者日期字符串轉換成時間戳,並且後移指定的時分秒。
mysql> select timestamp('1990-01-01', '11:11:11');
+-------------------------------------+
| timestamp('1990-01-01', '11:11:11') |
+-------------------------------------+
| 1990-01-01 11:11:11                 |
+-------------------------------------+

addtime(timestamp, time) : 將指定的time,timestamp後移指定時分秒。

mysql> select addtime('1990-01-01 12:12:12', '12:12:12');
+--------------------------------------------+
| addtime('1990-01-01 12:12:12', '12:12:12') |
+--------------------------------------------+
| 1990-01-02 00:24:24                        |
+--------------------------------------------+

mysql> select addtime('12:12:12', '12:12:12');
+---------------------------------+
| addtime('12:12:12', '12:12:12') |
+---------------------------------+
| 24:24:24                        |
+---------------------------------+

date_add(date, interval expr type): 對指定日期前移,後移指定時間

#後移指定小時;
mysql> select date_add( '1991-01-01', interval 1  hour  );
+---------------------------------------------+
| date_add( '1991-01-01', interval 1  hour  ) |
+---------------------------------------------+
| 1991-01-01 01:00:00                         |
+---------------------------------------------+

#後移指定天數
mysql> select date_add( '1991-01-01', interval 1  day  );
+--------------------------------------------+
| date_add( '1991-01-01', interval 1  day  ) |
+--------------------------------------------+
| 1991-01-02                                 |
+--------------------------------------------+

#後移指定天數和小時
mysql> select date_add('1991-01-02', interval '1 1' day_hour);
+-------------------------------------------------+
| date_add('1991-01-02', interval '1 1' day_hour) |
+-------------------------------------------------+
| 1991-01-03 01:00:00                             |
+-------------------------------------------------+
1 row in set (0.00 sec)

#前移指定天數 (使用負數,可以將時間前移)
mysql> select date_add('1991-01-02', interval -1 hour);
+------------------------------------------+
| date_add('1991-01-02', interval -1 hour) |
+------------------------------------------+
| 1991-01-01 23:00:00                      |
+------------------------------------------+

date_sub( date, interval expr type): 函數想日期添加指定的

mysql> select date_sub('1991-01-01', interval  '1' day);
+-------------------------------------------+
| date_sub('1991-01-01', interval  '1' day) |
+-------------------------------------------+
| 1990-12-31                                |
+-------------------------------------------+

8、月末月初計算

1、計算本月的月末

mysql> select last_day('2020-03-20');
+------------------------+
| last_day('2020-03-20') |
+------------------------+
| 2020-03-31             |
+------------------------+

2、計算月初

#方式一   利用日期格式化,拼湊日期。
mysql> select DATE( DATE_FORMAT('2020-03-20','%y-%m-01') );
+----------------------------------------------+
| DATE( DATE_FORMAT('2020-03-20','%y-%m-01') ) |
+----------------------------------------------+
| 2020-03-01                                   |
+----------------------------------------------+

#方式二
mysql> select date_sub('2020-03-20', INTERVAL day('2020-03-20')-1 day);
+----------------------------------------------------------+
| date_sub('2020-03-20', INTERVAL day('2020-03-20')-1 day) |
+----------------------------------------------------------+
| 2020-03-01                                               |
+----------------------------------------------------------+

3、計算三個月前的今天

mysql> select date_sub( '2020-02-20', interval 3 month );
+--------------------------------------------+
| date_sub( '2020-02-20', interval 3 month ) |
+--------------------------------------------+
| 2019-11-20                                 |

4、計算三個月前的月初

mysql> select date_format( date_sub('2020-02-20', interval 3 month), '%Y-%m-01' );
+---------------------------------------------------------------------+
| date_format( date_sub('2020-02-20', interval 3 month), '%Y-%m-01' ) |
+---------------------------------------------------------------------+
| 2019-11-01                                                          |
+---------------------------------------------------------------------+

5、獲取上個月的最後一天

#錯誤方式,先計算本月月末,再前移一個月
#得出的結果不是上個月的月末。
mysql> select date_sub( last_day('2020-02-20') , interval 1 month );
+-------------------------------------------------------+
| date_sub( last_day('2020-02-20') , interval 1 month ) |
+-------------------------------------------------------+
| 2020-01-29                                            |
+-------------------------------------------------------+

#應該採用計算月初,再減一天的方式
mysql> select date_sub( '2020-02-20' , interval day('2020-02-20') day);
+----------------------------------------------------------+
| date_sub( '2020-02-20' , interval day('2020-02-20') day) |
+----------------------------------------------------------+
| 2020-01-31                                               |
+----------------------------------------------------------+

9、星期幾計算

1、計算本週星期幾的日期

#求上週星期日的日期(外國人以上週星期日作爲一週的第一天)
mysql> select date_add('2020-02-20', interval 1-dayofweek('2020-02-20')  day );
+------------------------------------------------------------------+
| date_add('2020-02-20', interval 1-dayofweek('2020-02-20')  day ) |
+------------------------------------------------------------------+
| 2020-02-16                                                       |

#求本週星期六的日期
mysql> select date_add('2020-03-19', interval 7-dayofweek('2020-03-19')  day );
+------------------------------------------------------------------+
| date_add('2020-03-19', interval 7-dayofweek('2020-03-19')  day ) |
+------------------------------------------------------------------+
| 2020-03-21                                                       |
+------------------------------------------------------------------+

2、 計算3周之前的星期一

mysql> select date_add('2020-03-19', interval 7-dayofweek('2020-03-19')-21 day); 
+-------------------------------------------------------------------+
| date_add('2020-03-19', interval 7-dayofweek('2020-03-19')-21 day) |
+-------------------------------------------------------------------+
| 2020-02-29                                                        |
+-------------------------------------------------------------------+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章