全部產品
Search
文件中心

Lindorm:時間函數

更新時間:Mar 14, 2025

Lindorm時間函數可以實現指定類型的資料與TIMESTAMP時間戳記之間的相互轉換,並支援計算兩個時間戳記之間相差的天數。本文介紹Lindorm支援的時間函數及其使用方法。

引擎與版本

重要

要求Lindorm SQL為2.8.7.0及以上版本。如何查看Lindorm SQL的版本,請參見SQL版本說明

函數列表

Lindorm支援的時間函數如下表所示。

函數

說明

DATE_FORMAT

將TIMESTAMP類型的時間戳記基於當前會話時區進行格式化輸出。

FROM_UNIXTIME

將Number類型(例如BIGINT、INTEGER、SMALLINT、TINYINT等數實值型別)轉換成當前會話時區的TIMESTAMP時間戳記,如果存在兩個參數,則按照第二個參數進行格式化輸出。

DATEDIFF

計算兩個TIMESTAMP類型的時間戳記在當前會話時區下日期相隔的天數。

UNIX_TIMESTAMP

將TIMESTAMP或者時間戳記字串轉換成Epoch時間戳記(單位:秒)。

DATE_FORMAT

將TIMESTAMP類型的資料基於當前會話時區進行格式化輸出。如何查看或設定會話時區,請參見如何設定串連時區

文法

DATE_FORMAT(TIMESTAMP ts, STRING format)

參數說明

參數

是否必填

說明

ts

待格式化輸出的時間戳記。

format

格式說明符,具體格式為%<保留英文字母>%%。支援的格式說明符請參見下表。

支援的格式說明符、使用格式說明符後輸出的內容及其詳細介紹如下表所示:

格式說明符

輸出

輸出說明

%a

Sun~Sat

星期,英文縮寫。

%b

Jan~Dec

月份,英文縮寫。

%c

0~12

月份,數值。

%D

1st、2nd、3rd……

該月的第幾天,帶英文序數尾碼。

%d

00~31

該月的第幾天,兩位元的數值。

%e

00~31

該月的第幾天,數值。

%f

000000~999999

微秒。

%H

00~23

時間的時鐘,兩位元的數值,24小時制。

%h

01~12

時間的時鐘,兩位元的數值,12小時制。

%I

01~12

時間的時鐘,兩位元的數值,12小時制。

%i

00~59

時間的分鐘,兩位元的數值。

%j

001~366

該年的第幾天,三位元的數值。

%k

0~23

時間的時鐘,數值,24小時制。

%l

1~12

時間的時鐘,數值,12小時制。

%M

January~December

月份,英文全稱。

%m

01~12

月份,兩位元的數值。

%p

AM、PM

上午或者下午。

%r

hh:mm:ss AM/PM

時間的時分秒(hh:mm:ss),12小時制,帶上午(AM)或下午(PM)資訊。

%S

00~59

時間的秒數,兩位元的數值。

%s

00~59

時間的秒數,兩位元的數值。

%T

hh:mm:ss

時間的時分秒(hh:mm:ss),24小時制。

%W

Sunday~Saturday

星期,英文全稱。

%w

0~6

該星期的第幾天,數值。0代表星期日(Sunday),1代表星期一(Monday),以此類推。

%Y

四位元的數值。

年份,四位元的數值。例如2025

%y

兩位元的數值,取年份的後兩位。

年份,兩位元的數值,取年份的後兩位,例如2024,取後兩位為24

%%

%

輸出一個%字元。

%x

x

輸出x,x為保留英文字母以外的字元。例如:U為非保留英文字母,輸入%U後,會輸出U

重要

不設定格式符時,輸入任一字元,則所有不是以%開頭的字元都將按照原格式輸出。

樣本

將當前時區的時間戳記2024-01-01 17:20:35列印為at 17:20:35 on Jan 1st, 2024

SELECT DATE_FORMAT('2024-01-01 17:20:35', 'at %T on %b %D, %Y');

返回結果:

+------------------------------+
| EXPR$0                       |
+------------------------------+
| at 17:20:35 on JAN 1st, 2024 |
+------------------------------+

返回結果是該時間戳記在當前會話時區下,按照格式說明符列印出來的字串。

FROM_UNIXTIME

將Number類型(例如BIGINT、INTEGER、SMALLINT、TINYINT等數實值型別)轉換成當前會話時區的TIMESTAMP時間戳記,如果存在兩個參數,則按照第二個參數進行格式化輸出。

說明

Number類型的單位為秒(s),最多保留3位有效數字。

文法

  • 轉換成當前會話時區的TIMESTAMP。

    FROM_UNIXTIME (Number seconds) 
  • 先轉換成當前會話時區的TIMESTAMP,再格式化輸出。

    FROM_UNIXTIME (Number seconds, STRING format)

參數說明

參數

是否必填

說明

seconds

epoch時間戳記,單位為秒(s),最多保留3位小數。

seconds參數的值不考慮時區設定,僅表示GMT時區下自1970年1月1號0時0分0秒之後經過的秒數。FROM_UNIXTIME函數會將該值轉換為當前會話時區TIMESTAMP時間戳記。

format

格式說明符,詳情請參見支援的格式說明符

樣本

  • 樣本一:

    1. 將epoch時間戳記10.1578轉換成當前時區的TIMESTAMP。

      SELECT FROM_UNIXTIME(10.1578);

      返回結果:

      +-------------------------+
      | EXPR$0                  |
      +-------------------------+
      | 1970-01-01 08:00:10.158 |
      +-------------------------+
    2. 會話時區修改為+03:00後,將epoch時間戳記10.1578轉換成新時區的TIMESTAMP時間戳記。

      -- 修改會話時區為+03:00
      SET @@time_zone='+03:00';
      
      -- 轉換為新時區的TIMESTAMP
      SELECT FROM_UNIXTIME(10.1578);
      說明

      僅MySQL協議支援修改串連時區。MySQL協議串連方式,請參見使用MySQL協議(推薦)通過MySQL命令列串連並使用寬表引擎

      返回結果:

      +-------------------------+
      | EXPR$0                  |
      +-------------------------+
      | 1970-01-01 03:00:10.158 |
      +-------------------------+
  • 樣本二:

    1. 將epoch時間戳記10.1578轉換成當前時區的TIMESTAMP,並按照指定格式輸出。

      SELECT FROM_UNIXTIME(10.1578, 'at %T on %b %D, %Y');

      返回結果:

      +------------------------------+
      | EXPR$0                       |
      +------------------------------+
      | at 08:00:10 on JAN 1st, 1970 |
      +------------------------------+
    2. 會話時區修改為+03:00後,將epoch時間戳記10.1578轉換成新時區的TIMESTAMP,並按照指定格式輸出。

      -- 修改會話時區為+03:00
      SET @@time_zone='+03:00';
      
      -- 轉換為新時區的TIMESTAMP
      SELECT FROM_UNIXTIME(10.1578, 'at %T on %b %D, %Y');

      返回結果:

      +------------------------------+
      | EXPR$0                       |
      +------------------------------+
      | at 03:00:10 on JAN 1st, 1970 |
      +------------------------------+

DATEDIFF

計算兩個TIMESTAMP類型的時間戳記,在當前會話時區下日期相隔的天數。

計算方式:用前者減去後者

  • 若結果為正數,則第一個時間戳記表示的日期更晚。

  • 若結果為負數,則第一個時間戳記表示的日期更早。

  • 若結果為0,表示兩個時間戳記的日期是同一天。

重要

系統會自動忽略時分秒資訊,僅比較日期。

文法

DATEDIFF(TIMESTAMP ts1, TIMESTAMP ts2)

參數說明

參數

是否必填

說明

ts1

第一個時間戳記。

ts2

第二個時間戳記。

樣本

  • 樣本一:

    SELECT DATEDIFF('2024-01-01 15:30:00', '2024-01-02 00:59:59');

    返回結果

    +--------+
    | EXPR$0 |
    +--------+
    |     -1 |
    +--------+
  • 樣本二:

    SELECT DATEDIFF('2024-01-05 15:30:00', '2024-01-02 00:59:59');

    返回結果

    +--------+
    | EXPR$0 |
    +--------+
    |      3 |
    +--------+
  • 樣本三:

    SELECT DATEDIFF('2024-01-02 15:30:00', '2024-01-02 00:59:59');

    返回結果

    +--------+
    | EXPR$0 |
    +--------+
    |      0 |
    +--------+

UNIX_TIMESTAMP

將TIMESTAMP類型或時間戳記字串轉換成Epoch時間戳記(單位:秒),並返回DOUBLE類型。

當參數類型是TIMESTAMP類型時,傳回值最多隻有3位小數;當參數是時間戳記字串時,會被當成當前會話時區的時間來進行轉換,傳回值最多有6位小數。

重要

文法

UNIX_TIMESTAMP (ts)

參數說明

參數

是否必填

說明

ts

僅支援TIMESTAMP和VARCHAR類型,表示當前會話時區的時間戳記。

樣本

假設樣本表t1的結構與表中資料如下:

-- 建立樣本表t1
CREATE TABLE t1(p1 INT, c1 TIMESTAMP, c2 VARCHAR, c3 DOUBLE, PRIMARY KEY(p1));

-- 插入資料
UPSERT INTO t1(p1, c1, c2, c3) VALUES 
(1, '2025-01-01 08:30:00', '2025-01-01 08:30:00', '12.24'),
(2, '1970-01-01 08:00:00.123', '1970-01-01 08:00:00.123', '10.32'),
(3, '1970-01-01 08:00:10.13579', '1970-01-01 08:00:10.13579', '10.12'),
(4, '1970-01-01 08:00:10.123456789', '1970-01-01 08:00:10.123456789', '17.33');
  • 樣本一:查詢TIMESTAMP或者時間戳記字串對應的Epoch時間戳記。

    SELECT p1, UNIX_TIMESTAMP(c1), UNIX_TIMESTAMP(c2) FROM t1;

    返回結果:

    +----+------------+------------+
    | p1 | EXPR$1     | EXPR$2     |
    +----+------------+------------+
    | 1  | 1735691400 | 1735691400 |
    | 2  | 0.123      | 0.123      |
    | 3  | 10.135     | 10.13579   |
    | 4  | 10.123     | 10.123457  |
    +----+------------+------------+
  • 樣本二:統計UNIX_TIMESTAMP(c1) > 10的值。

    SELECT COUNT(*) FROM t1 WHERE UNIX_TIMESTAMP(c1) > 10;

    返回結果:

    +--------+
    | EXPR$0 |
    +--------+
    | 3      |
    +--------+
  • 樣本三:將UNIX_TIMESTAMP函數的轉換結果寫入c3(類型為DOUBLE)列。

    UPSERT INTO t1(p1, c3) VALUES(1, UNIX_TIMESTAMP('1970-01-01 08:00:00.123'));

    結果驗證

    您可以執行SELECT * FROM t1;語句驗證是否寫入成功。