日期類型與常見日期類型總結
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 |
+-------------------------------------------------------------------+