天天看點

時間日期處理-mysql1. mysql 日期

希望将sql、pandas中用到的常見時間日期操作做個總結,便于日常工作中檢視使用。

下一篇:時間日期處理-pandas

文章目錄

  • 1. mysql 日期
    • 1.1 mysql 日期和時間類型
    • 1.2 mysql 日期和時間函數
      • 1.2.1 擷取目前時間、日期
      • 1.2.2 常用時間選取函數
      • 1.2.3 日期和時間的增減
      • 1.2.4 日期時間間隔
      • 1.2.5 日期時間格式轉換
      • 1.2.6 日期時間比較
      • 1.2.7 UNIX時間戳

1. mysql 日期

1.1 mysql 日期和時間類型

  • mysql中總共有5種日期時間類型,建表的時候可以指定該列的日期時間類型,具體如下表:
類型 大小(位元組) 格式 最小值 最大值 舉例
DATE 4 YYYY-MM-DD 1000-01-01 9999-12-31 1973-12-30
TIME 3 HH:MM:SS -838:59:59 838:59:59 15:30:00
DATETIME 8 YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 1973-12-30 15:30:00
TIEMSTAMP 4 YYYYMMDDHHMMSS 1970-01-01 00:00:00 2038年某個時刻 19731230153000
YEAR(2|4) 1 YYYY或YY 1901(4位)1970(2位) 2155(4位) 2069(2位) 1973
  • 區分DATETIME和TIEMSTAMP:
    1. 兩者都可用來表示YYYY-MM-DD HH:MM:SS 類型的日期:timestamp類型在mysql中是以‘YYYY-MM-DD HH:MM:SS’的形式顯示,雖然其存儲形式為‘YYYYMMDDHHMMSS’。
    2. 位元組數不同,時間範圍不同:timestamp占用記憶體小,但它可取範圍也小:在1970-2038之間;而datetime範圍在1000-9999,時間範圍比較廣。
    3. 涉及時區問題:timestamp類型能夠根據不同地區的時區來轉換時間;而datetime不會。

      例如在東八區插入的timestamp類型為2020-06-20 14:21:25,在東七區顯示時,時間就變成了13:21:25,在東九區顯示時,時間就變成了15:21:25。而插入datetime類型時不論在哪個時區檢視都顯示2020-06-20 14:21:25。

      是以如果涉及跨時區業務,使用timestamp更合适。

1.2 mysql 日期和時間函數

1.2.1 擷取目前時間、日期

函數 功能
curdate() 傳回目前日期
curtime() 傳回目前時間
now() 傳回目前日期+時間

1.2.2 常用時間選取函數

函數 功能 函數 功能
date() 傳回指定日期時間的日期部分 time() 傳回指定日期時間的時間部分
year() 傳回指定日期時間的所在年份 quarter() 傳回指定日期時間的所在季度
month() 傳回指定日期時間的所在月份 week() 傳回指定日期時間是第幾周
day() 傳回指定日期時間是當月的第幾天 hour() 傳回指定日期時間的小時數
minute() 傳回指定日期時間的分鐘數 second() 傳回指定日期時間的秒數
函數 功能 函數 功能
dayofyear() 傳回指定時間是當年的第幾天 dayofweek()
dayofmonth() 同month() weekofyear() 注意weekofyear() = week() + 1
dayname() 傳回星期幾名稱 ,如Monday monthname() 傳回月名稱,如July
  • 如果想同時擷取比如year-month,可以使用extract()函數:

    EXTRACT(unit FROM date)

    - unit 就是常見的day/month 等,取單個機關與上述函數功能 一緻

    - 可以同時取到的有:year_month、hour_minute等。注意傳回的是202006形式,不是2020-06

select extract(year_month from now());
-- 傳回的是202006
           
時間日期處理-mysql1. mysql 日期

1.2.3 日期和時間的增減

data_add()、adddate()、date_sub()、subdate()
  1. 增加
  • date_add(date,INTERVAL expr unit)

    - unit :day、week、month、year、hour、minute、second等

SELECT date_add('2020-06-20',interval 1 day)  -- 增加1天
      ,date_add(now(),interval 1 month)       -- 增加1個月
      ,date_add(curtime(),interval 3 minute); -- 增加3分鐘
           
時間日期處理-mysql1. mysql 日期
  • adddate(date,天數)
  1. 減少

    date_sub(date,INTERVAL expr unit)

    subdate(date,天數)

1.2.4 日期時間間隔

datediff()、timediff()、timestampdiff()
  1. datediff(日期1,日期2)

    -傳回的是相差的天數,日期1 - 日期2;

  2. timediff(時間1,時間2)

    -傳回結果是時間表達式hh:mm:ss,時間1 - 時間2;

  3. timestampdiff(unit,日期1,日期2)

    - 日期2-日期1的時間差(注意與datediff順序不同),機關由unit參數決定

    - unit 同上,支援常見的day week month quarter year hour minute second等。

1.2.5 日期時間格式轉換

在MySQL中,日期/時間對象輸出時會自動轉為字元串,而運算時字元串又會自動轉為日期/時間對象完成運算,這中間就是時間轉換函數在發揮作用。

是以,用日期時間形式的字元串如‘2020-06-20’計算時就自動轉為了日期對象。

  1. date_format(date,format)

    -将日期轉換為指定格式的字元串

  2. str_to_date(str,format)

    - 将日期字元串轉換為日期格式

  • format 格式表查詢見參考資料内容。

1.2.6 日期時間比較

日期時間是直接可以比較大小,日期時間距現在越近的越大。

Mysql中可以直接用字元串進行比較時間大小, 隻要你的日期格式是合法的就行。

表中字段類型都為varchar的,也可以直接進行比較大小。

select curdate()='2020-06-20'
       ,'2020-09-09' > '2020-08-08'
       ,'2020-06-20' > '2020-06-20 02:08:00'; -- 第一個日期會自動補全時間00:00:00
-- 傳回1,表示true;0表示false
           
時間日期處理-mysql1. mysql 日期

1.2.7 UNIX時間戳

Unix時間(Unix Time),也叫做POSIX時間或紀元時間(Epoch Time),是用來記錄時間的流逝,是以也常被叫做時間戳。

定義為從1970-01-01T00:00:00開始流逝的秒數,不考慮閏秒。之後的時間是正數,之前的是負數。

從定義可以看到,它隻代表了從Unix紀元開始流逝的秒數,是以你身處地球上何處,這個時間都是一樣的。

  1. unix_timestamp([date])

    -用于傳回指定時間的UNIX時間戳;若未指定時間,則預設傳回目前時間的時間戳

SELECT UNIX_TIMESTAMP()
      ,UNIX_TIMESTAMP(curdate());
           
時間日期處理-mysql1. mysql 日期

2. from_unixtime(unix_time)

- 将unix時間戳轉換為正常的時間形式;

時間日期處理-mysql1. mysql 日期

【參考資料】

MySQL日期與時間函數(日期/時間格式化、增減、對比、時區、UTC和UNIX時間)

繼續閱讀